本题好坑人,居然还有那种情况。。。
- #include <stdio.h>
- #define LLU unsigned long long
- LLU Euler(LLU n)
- {
- LLU i;
- LLU ret=n;
- for(i=2;i*i<=n;i++)
- {
- if(n%i==0)
- {
- ret=ret-ret/i;
- while(n%i==0) n/=i;
- }
- }
- if(n>1)
- ret=ret-ret/n;
- return ret;
- }
- LLU quick_mod(LLU a,LLU b,LLU m)
- {
- LLU ans=1;
- while(b)
- {
- if(b&1)
- {
- ans=ans*a%m;
- b--;
- }
- b>>=1;
- a=a*a%m;
- }
- return ans;
- }
- LLU f[100001];
- int main()
- {
- int t,T,i,k,l,flag;
- LLU b,p,m,phi,ans;
- scanf("%d",&T);
- for(t=1;t<=T;t++)
- {
- ans=0;flag = 0;
- scanf("%I64u%I64u%I64u",&b,&p,&m);
- if(b==0&&p==1&&m==18446744073709551615ull)
- {
- printf("Case #%d: 18446744073709551616\n",t);
- continue;
- }
- phi=Euler(p);
- f[0]=1;
- if(b==0)
- ans++;
- for(i=1;i<=m;i++)
- {
- f[i] = f[i-1]*i;
- if(f[i]>=phi)
- {
- f[i]=f[i]%phi;
- flag=1;
- if(f[i]==0)
- break;
- }
- if(flag)
- {
- if(quick_mod(i,f[i]+phi,p)==b)
- ans++;
- }
- else
- {
- if(quick_mod(i,f[i],p)==b)
- ans++;
- }
- }
- for(k=0;i<=m&&k<p;i++,k++)
- if(quick_mod(i,phi,p)==b)
- ans = ans+1+(m-i)/p;
- printf("Case #%d: %I64u\n",t,ans);
- }
- return 0;
- }
- #include <iostream>
- #include <string.h>
- #include <stdio.h>
- using namespace std;
- typedef long long LL;
- const int N=105;
- LL p[N],a[N];
- LL phi(LL n)
- {
- LL rea=n,i;
- for(i=2;i*i<=n;i++)
- {
- if(n%i==0)
- {
- rea=rea-rea/i;
- while(n%i==0) n/=i;
- }
- }
- if(n>1)
- rea=rea-rea/n;
- return rea;
- }
- void Init(LL m)
- {
- p[0]=m;
- for(LL i=1;i<105;i++)
- p[i]=phi(p[i-1]);
- }
- LL Solve(LL k,LL *up)
- {
- LL i,j,chk;
- LL m=p[k];
- LL res,num,next,num_is_big=0;
- if (m==1)
- {
- if(a[k]>1) *up=1;
- else *up=0;
- return 0;
- }
- if (a[k]>=m) {*up=1; return 0;}
- num=1;
- for(i=2;i<=a[k];i++)
- {
- num=num*i;
- if (num>=m) num_is_big=1, num%=m;
- }
- next=Solve(k+1,&chk);
- if (chk==1) next+=phi(m);
- res=1; *up=0;
- for(i=0;i<next;i++)
- {
- res=res*num;
- if (res>=m) *up=1,res%=m;
- if (num_is_big) *up=1;
- }
- return res;
- }
- int main()
- {
- LL n,t,m,i;
- cin>>t;
- while(t--)
- {
- cin>>n>>m;
- for(i=0;i<n;i++)
- cin>>a[i];
- if(m==1)
- {
- puts("0");
- continue;
- }
- Init(m);
- cout<<Solve(0,&i)<<endl;
- }
- return 0;
- }