3500: PA2008 Cliquers

链接

  http://www.lydsy.com/JudgeOnline/problem.php?id=3500

题解

   long long 太慢了, mod 太慢了
  常数啊常数,竟让能让两个程序的时间差到 5 倍!

  显然,这是一道弃疗题。
  直接查题解,发现这个东西是有递推式的。
  f1=1,f2=2,f3=5,f4=7...
   fi=3+2×fi2fi4
  答案 gi=gif1+gif2gif3gif4+...
   ++ 交替。
  打个表发现 f 单调且增的比较快,第730项就已经大于 200000 了,所以后面的不用管了,这样时间复杂度就保证了。
  中间递推 g 的时候,要模999999598防炸。
  最后快速幂。


  其实我也不是完全没想就弃疗了。
  容易发现这个问题就等价于 x1+x2+x3+...=N 的非负整数解的个数,且要求一组解中 x1x2x3...
  想到这里我就不会了,去翻题解。

代码

//结论题
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值