poj 2409
分两种情况讨论:
旋转:
n种旋转方法每种旋转i个格(1<=i<=n)循环结有gcd(i,n)个
翻转:
旋转:
n种旋转方法每种旋转i个格(1<=i<=n)循环结有gcd(i,n)个
翻转:
(1)这种是经过某个顶点i与中心的连线为轴的翻转,由于n为偶数,有对称性,所以此种共n/2种翻转:
(2)这种是以顶点i和i+1的连线的中点与中心的连线为轴的翻转,同样,根据对称性,也有n/2种翻转:
所以给定长度n,共有2n种置换。
代码:
#include<iostream> #include<fstream> #include<cmath> using namespace std; int gcd(int s,int t){ if(t==0) return s; return gcd(t,s%t); } int m,n; void read(){ // ifstream cin("in.txt"); int i,j,k; long long ans; while(1){ cin>>m>>n; if(n==0&&m==0) return; ans=0; for(i=0;i<n;i++) ans+=pow(1.*m,gcd(n,i)); if(n%2==0) ans+=n/2*pow(1.*m,n/2)+n/2*pow(1.*m,n/2+1); else ans+=n*pow(1.*m,n/2+1); cout<<ans/n/2<<endl; } } int main(){ read(); return 0; }