链接
http://www.lydsy.com/JudgeOnline/problem.php?id=3500
题解
long long 太慢了, mod 太慢了
常数啊常数,竟让能让两个程序的时间差到 5 倍!
显然,这是一道弃疗题。
直接查题解,发现这个东西是有递推式的。
fi=3+2×fi−2−fi−4
答案
gi=gi−f1+gi−f2−gi−f3−gi−f4+...
++−−
交替。
打个表发现
f
单调且增的比较快,第
中间递推
g
的时候,要模
最后快速幂。
其实我也不是完全没想就弃疗了。
容易发现这个问题就等价于
x1+x2+x3+...=N
的非负整数解的个数,且要求一组解中
x1≤x2≤x3≤...
想到这里我就不会了,去翻题解。
代码
//结论题
#include <cstdio>
#define maxn 200010
#define mod 999999599
#define ll long long
using namespace std;
inline int fastpow(int a, int b, int p)
{
int t, ans;
for(ans=1,t=a;b;b>>=1,t=(ll)t*t%mod)if(b&1)ans=(ll)ans*t%mod;
return ans;
}
int f[maxn]={0,1,2,5,7}, g[maxn]={1}, N, M, x[maxn];
int main()
{
int i, j;
scanf("%d%d",&N,&M);
for(i=5;f[i-1]<=N;i++)f[i]=3+2*f[i-2]-f[i-4];
x[1]=x[2]=1;
for(i=3;i<=N;i++)x[i]=x[i+1]=-x[i-2];
for(i=1;i<=N;i++)for(j=1;f[j]<=i;j++)g[i]=(g[i]+x[j]*g[i-f[j]])%(mod-1);
printf("%d\n",fastpow(M,(g[N]+mod-1)%(mod-1),mod));
return 0;
}