poj2409(純Polya定理)
阿新 • • 發佈:2021-02-19
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int mod=9937;
int n,m;
int exgcd(int a,int b,int&x,int&y){//歐幾里得擴充套件
if(b==0){
x=1;y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t- a/b*y;
return r;
}
int pow(int a,int b){//快速冪
int ans=1;
while(b){
if(b&1){
ans=(ans*a);
}
a=(a*a);
b>>=1;
}
return ans;
}
int main(){
while(cin>>m>>n){
int ans=0;
int x=0,y=0;
if(n==0&&m==0)break;
for(int i=1;i<=n;i++){
ans+=pow(m,exgcd(n,i,x,y)) ;
}
if(n&1){
ans+=n*pow(m,(n+1)/2);
}else{
ans+=n*(pow(m,n/2)+pow(m,n/2+1))/2;
}
cout<<ans/(2*n)<<endl;
}
return 0;
}