【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;
}

 

posted @ 2018-07-19 14:34  泪寒之雪  阅读(141)  评论(0编辑  收藏  举报