哇, 这个题就我一个人得了80分的吗

P2480 [SDOI2010] 古代猪文

刚刚通过了 虽然我也并不知道我到底干了啥就过了 好像是把`long long bala=1`改成了`long long bala=1ll`. ```c++ #include<cmath> #include<cstdio> #include<iostream> #define mod 999911659 #define Mod 999911658 using namespace std; int s[5]={2,3,4679,35617}; int n,g; void exgcd(int a,int b,int &x,int &y){ if(!b){x=1,y=0;return;} exgcd(b,a%b,y,x); y-=a/b*x; } int Inv(int a,int p){ int x,y,c; exgcd(a,p,x,y); x=(x%p+p)%p; if(!x)x+=p; return x; } int C(int n,int m,int mo){ if(m>n)return 0; long long up=1ll,down=1ll; for(int i=n-m+1;i<=n;++i)up=up*i%mo; for(int i=1;i<=m;++i)down=down*i%mo; return up*Inv(down,mo)%mo; } int Lucas(int n,int m,int mo){ if(m>n)return 0; long long ans=1ll,nn=n,mm=m; for(;m;n/=mo,m/=mo) ans=ans*C(n%mo,m%mo,mo)%mo; return ans; } int China(int n, int a[], int m[]) { int ans=0,w,x; for(int i=0;i < n; i++) { w=Mod/m[i]; x=Inv(w,m[i]); ans=(ans+(long long)x*w*a[i])%Mod; } return (ans+Mod)%Mod; } int Calc(int m){ int b[5]={0};long long ans=0; for(int i=0;i<4;++i){ b[i]=Lucas(n,m,s[i]); } ans=China(4,b,s); return ans; } int Pow(int a,int b){ long long ans=1ll,bas=a; while(b){ if(b&1)ans=(ans*bas)%mod; bas=(bas*bas)%mod; b>>=1; } return ans; } main(){ int ans=0; scanf("%d%d",&n,&g); if(g==mod){ printf("0"); return 0; } for(int i=1;i<sqrt(n);++i) if(n%i==0) ans=((ans+Calc(i))%Mod+Calc(n/i))%Mod; int Answer=Pow(g,ans); printf("%d",Answer); return 0; } ```
by aiyougege @ 2018-06-13 21:29:34


|