【POJ 1286】Necklace of Beads(polya定理)
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7550 | Accepted: 3145 |
Description
Input
Output
Sample Input
4 5 -1
Sample Output
21 39
Source
polya裸题,。教程翻烂了百度,全是那么一套……然而没太明白,请教QAQ巨稍微理解了点,。
题目说旋转和对称算同种,所以枚举所有旋转和对称步数,然后套公式……
代码如下:
#include <iostream> #include <cmath> #include <vector> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <list> #include <algorithm> #include <map> #include <set> #define LL long long #define Pr pair<int,int> #define fread() freopen("in.in","r",stdin) #define fwrite() freopen("out.out","w",stdout) using namespace std; const int INF = 0x3f3f3f3f; const int msz = 32768; const int mod = 1e9+7; const double eps = 1e-8; int main() { int n; LL ans; while(~scanf("%d",&n) && n != -1) { if(!n) { puts("0"); continue; } ans = 0; for(int i = 1; i <= n; ++i) ans += pow(3.0,__gcd(n,i)); if(n&1) printf("%lld\n",(ans+(LL)pow(3.0,1+n/2)*n)/(n*2)); else printf("%lld\n",(ans+(LL)pow(3.0,n/2)*(n/2)+(LL)pow(3.0,2+(n-2)/2)*(n/2))/(2*n)); } return 0; }