Polya定理。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long tab[50],n,ans=0; long long gcd(long long a,long long b) { if (!b) return a; return gcd(b,a%b); } int main() { tab[0]=1;for (long long i=1;i<=24;i++) tab[i]=tab[i-1]*3; for (;;) { scanf("%lld",&n); if (!n) {printf("0\n");continue;} if (n==-1) break; ans=0; for (long long i=0;i<=n-1;i++) ans+=tab[gcd(i,n)]; if (n&1) ans+=n*tab[n/2+1]; else ans+=(n/2)*tab[n/2+1]+(n/2)*tab[n/2]; ans/=2*n; printf("%lld\n",ans); } return 0; }