http://poj.org/problem?id=2409
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> #include<cmath> #define LL long long using namespace std; int gcd(int a,int b) { if(a%b==0) return b; return gcd(b,a%b); } LL ploya(int n,int m) { if(n==0) return 0; LL ans=0; for(int i=1;i<=n;++i) { ans+=(LL)(pow(double(m),gcd(n,i))); }//cout<<ans<<endl; if(n%2==1) { ans+=(n*((LL)(pow(double(m),(n+1)/2)))); }else { ans+=(n/2*(LL)(pow(double(m),n/2)+pow(double(m),(n+2)/2))); } return ans/n/2; } int main() { int n,m; while(scanf("%d %d",&m,&n)!=EOF) { if(n==0&&m==0) break; cout<<ploya(n,m)<<endl; } return 0; }