- #include <iostream>
- using namespace std;
- typedef unsigned long long LL;
- LL phi(LL n)
- {
- LL i,m=n;
- for(i=2;i*i<=n;i++)
- {
- if(n%i==0)
- {
- m=m-m/i;
- while(n%i==0) n/=i;
- }
- }
- if(n>1)
- m=m-m/n;
- return m;
- }
- LL quick_mod(LL a,LL b,LL MOD)
- {
- LL ans=1;
- a%=MOD;
- while(b)
- {
- if(b&1)
- {
- ans=ans*a%MOD;
- b--;
- }
- b>>=1;
- a=a*a%MOD;
- }
- return ans;
- }
- LL f(LL p,LL n,LL MOD)
- {
- if(n==0) return p%MOD;
- if(MOD==1||p%MOD==0) return 0;
- LL pm=phi(MOD);
- return quick_mod(p,pm+f(p,n-1,pm),MOD);
- }
- void Solve(LL p,LL m)
- {
- LL k=m;
- while(k-->1) m*=k;
- LL last = f(p,1,m);
- LL i = 2;
- while(1)
- {
- LL now = f(p,i,m);
- if(now == last) break;
- i++;last=now;
- }
- cout<<last<<endl;
- }
- int main()
- {
- LL p,m;
- bool first=true;
- while(cin>>p>>m)
- {
- if(first) first=false;
- else cout<<endl;
- Solve(p,m);
- }
- return 0;
- }
由于数据很小,完全可以打表。
- #include <iostream>
- using namespace std;
- typedef unsigned long long LL;
- LL arr[255][255];
- int main()
- {
- arr[2][2]=0;
- arr[2][3]=4;
- arr[2][4]=16;
- arr[2][5]=16;
- arr[2][6]=16;
- arr[2][7]=16;
- arr[2][8]=25216;
- arr[2][9]=186496;
- arr[2][10]=1275136;
- arr[2][11]=26676736;
- arr[2][12]=106510336;
- arr[3][2]=1;
- arr[3][3]=3;
- arr[3][4]=3;
- arr[3][5]=27;
- arr[3][6]=27;
- arr[3][7]=27;
- arr[3][8]=30267;
- arr[3][9]=151227;
- arr[3][10]=2691387;
- arr[3][11]=31721787;
- arr[3][12]=430889787;
- arr[5][2]=1;
- arr[5][3]=5;
- arr[5][4]=5;
- arr[5][5]=5;
- arr[5][6]=245;
- arr[5][7]=3125;
- arr[5][8]=23285;
- arr[5][9]=345845;
- arr[5][10]=708725;
- arr[5][11]=18852725;
- arr[5][12]=18852725;
- arr[7][2]=1;
- arr[7][3]=1;
- arr[7][4]=7;
- arr[7][5]=103;
- arr[7][6]=583;
- arr[7][7]=2023;
- arr[7][8]=17143;
- arr[7][9]=339703;
- arr[7][10]=1428343;
- arr[7][11]=8685943;
- arr[7][12]=208269943;
- arr[11][2]=1;
- arr[11][3]=5;
- arr[11][4]=11;
- arr[11][5]=11;
- arr[11][6]=131;
- arr[11][7]=2291;
- arr[11][8]=2291;
- arr[11][9]=244211;
- arr[11][10]=244211;
- arr[11][11]=244211;
- arr[11][12]=119994611;
- LL p,m;
- bool first=true;
- while(cin>>p>>m)
- {
- if(first) first=false;
- else cout<<endl;
- cout<<arr[p][m]<<endl;
- }
- return 0;
- }