【GDOI2016模拟3.16】图计数
Description
Sol:
这道题显然是求在%999999598意义下的n的整数划分。
#include<bits/stdc++.h> #define p 999999599 #define LL long long using namespace std; LL qsm(LL x,LL y,LL mo){ static LL anw; for (anw=1;y;y>>=1,x=x*x%mo) if (y&1) anw=anw*x%mo; return anw; } #define AMS 200005 LL pp[AMS]; LL asist[2*AMS]; #define MOD (p-1) void myinit(){ for(int i=0;i<AMS;i++){ asist[2*i]=i*(i*3-1)/2; asist[2*i+1]=i*(i*3+1)/2; } } void mymethod() { pp[1]=1;pp[2]=2;pp[0]=1; for(int i=3;i<AMS;i++){ int k=0; int flags; pp[i]=0; for(int j=2;asist[j]<=i;j++){ flags=k&2; if(!flags) pp[i]=(pp[i]+pp[i-asist[j]]+MOD)%MOD; else pp[i]=(pp[i]-pp[i-asist[j]]+MOD)%MOD; k++; k%=8; } } } LL n,m; signed main () { scanf("%lld%lld",&n,&m); myinit(); mymethod(); printf("%lld",qsm(m,pp[n],p)); return 0; }