1. 程式人生 > >UVA10294 Arif in Dhaka (First Love Part 2)

UVA10294 Arif in Dhaka (First Love Part 2)

情況 競賽 討論 text part 算法競賽入門經典 轉置 ret nbsp

本文是劉汝佳《算法競賽入門經典——訓練指南》的讀書筆記。

解題思路:

  對於項鏈,它只支持旋轉置換;而手鐲支持旋轉和翻轉。下面由這兩種置換來研究本題。

  旋轉

  設順時針旋轉 \(i\) 顆珠子的間距,則珠子 \(0, i, 2i, ...\) 構成一個循環。

  設每個循環有 \(t\) 顆珠子,則這 \(t\) 顆珠子的編號分別為:\(0, (i \mod n), (2i \mod n), ... [(t-1)i \mod n]\),我們不能推出:\(ti \mod n = 0\),即 \(ti = nk, k \in Z\).則\(ti = nk\) 的最小值為 \(lcm(i,n)\),故由 \(ti = nk = lcm(i,n)\) 得

  \(ti = \frac{in}{gcd(i,n)}\)

  \(t = \frac{n}{gcd(i,n)}\)

  則循環數為\(\frac{n}{t} = gcd(i,n)\).

  不動點總數為 \(a = \sum_{i=0}^{i=n-1} t^{gcd(i,n)}\).

翻轉

  分 \(n\) 為奇數偶數兩種情況討論:

  若 \(n\) 為奇數,則對稱軸有 \(n\) 條,每條對稱軸形成 \(\frac{n-1}{2}\) 個二元循環和 \(1\) 個一元循環,其總循環數為  \(\frac{n+1}{2}\). 不動點總數為 \(b = nt^{\frac{n+1}{2}}\).

  若 \(n\) 為偶數,對稱軸有兩種,一種穿過兩個對點,這種對稱軸形成 \(2\) 個一元循環和 \(\frac{n}{2} - 1\) 個二元循環;一種是穿過兩條對邊的中點,這種對稱軸形成 \(\frac{n}{2}\) 個二元循環。兩種對稱軸都有 \(\frac{n}{2}\) 條,則不動點總數為 \(b = \frac{n}{2}(t^{\frac{n}{2}}+t^{\frac{n}{2}+1})\).

  則項鏈數為 \(\frac{a}{n}\),手鐲數為 \(\frac{a+b}{2n}\).

AC代碼:

 1 #include <bits/stdc++.h>
 2
3 using namespace std; 4 typedef long long ll; 5 ll pows[100]; 6 ll gcd(ll a,ll b){ 7 if(b==0) return a; 8 return gcd(b,a%b); 9 } 10 int main(){ 11 ll n,t; 12 while(scanf("%lld%lld",&n,&t)==2){ 13 ll xuan=0; 14 pows[0]=1; 15 for(int i=1;i<=n;i++) pows[i]=pows[i-1]*t; 16 for(ll i=0;i<n;i++){ 17 ll g=gcd(i,n); 18 xuan+=pows[g]; 19 } 20 ll fan=0; 21 if(n%2==1) 22 fan=pows[(n+1)/2]*n; 23 else 24 fan=(pows[n/2]+pows[n/2+1])*n/2; 25 printf("%lld %lld\n",xuan/n,(fan+xuan)/(2*n)); 26 27 } 28 29 30 return 0; 31 }

UVA10294 Arif in Dhaka (First Love Part 2)