/* 旋转:n个点顺时针或者逆时针旋转i个位置的置换,循环数为gcd(n,i) 翻转: N为偶数时: (1)这种是经过某个顶点i与中心的连线为轴的翻转,即对称轴过顶点,有对称性,循环数为:n/2. 所以此种共n/2种翻转: (2)这种是以顶点i和i+1的连线的中点与中心的连线为轴的翻转,即对称轴不过顶点,同样,根据对称性,循环数为n/2+1. 且有n/2种翻转。 N为奇数: 循环数为(n+1)/2. 所以给定长度n,共有2n种置换。 */ #include<iostream> #include <stdlib.h> #include <algorithm> #include <stdio.h> #include<vector> using namespace std; int prime[24]; int num,n,p; void getprime() { prime[0]=2; prime[1]=3; prime[2]=5; prime[3]=7; prime[4]=11; prime[5]=13; prime[6]=17; prime[7]=19; prime[8]=23; } int euler(int x) { int res=x; for(int i=0;prime[i]*prime[i]<=x;i++) { if(x%prime[i]==0) { res=res/prime[i]*(prime[i]-1); while(x%prime[i]==0) { x/=prime[i]; } } } if(x>1) res=res/x*(x-1); return res; } __int64 fun(int a,int b) { __int64 ret=1; a=a; while(b>0) { if(b&1)ret=(ret*a); a=(a*a); b>>=1; } return ret; } int main() { getprime(); int c=3; while(scanf("%d",&n),n!=-1) { if(n==0){puts("0");continue;} __int64 ans = 0; for (int i = 1; i <= n; i++)if (n % i == 0) { ans += fun(c, i) * euler(n / i); } if (n & 1) ans += n * fun(c, n / 2 + 1); else ans += n / 2 * (fun(c, n / 2) + fun(c, n / 2 + 1)); cout << ans / (2 * n) << endl; } return 0; }
/* 与上一题同 不赘述 */ #include<iostream> #include <stdlib.h> #include <algorithm> #include <stdio.h> #include<vector> using namespace std; int prime[24]; int num,n,p; void getprime() { prime[0]=2; prime[1]=3; prime[2]=5; prime[3]=7; prime[4]=11; prime[5]=13; prime[6]=17; prime[7]=19; prime[8]=23; } int euler(int x) { int res=x; for(int i=0;prime[i]*prime[i]<=x;i++) { if(x%prime[i]==0) { res=res/prime[i]*(prime[i]-1); while(x%prime[i]==0) { x/=prime[i]; } } } if(x>1) res=res/x*(x-1); return res; } __int64 fun(int a,int b) { __int64 ret=1; a=a; while(b>0) { if(b&1)ret=(ret*a); a=(a*a); b>>=1; } return ret; } int main() { getprime(); int c=3; while(scanf("%d%d",&c,&n),n+c) { __int64 ans = 0; for (int i = 1; i <= n; i++)if (n % i == 0) { ans += fun(c, i) * euler(n / i); } if (n & 1) ans += n * fun(c, n / 2 + 1); else ans += n / 2 * (fun(c, n / 2) + fun(c, n / 2 + 1)); cout << ans / (2 * n) << endl; } return 0; }