题意,在n本书中要拿k本书的倍数的方案,每本书都不同,一本都不拿也算一种方案
1≤k≤3e4或者1≤k≤3e5并且为2的次幂。1≤n≤10181≤k≤3e4或者1≤k≤3e5并且为2的次幂。 1≤n≤10^18

开始以为是直接求C(n,0)+C(n,k)+C(n,2k)…

求不出来 orz

看了题解后 问了yql大佬

先是可以得到一个递推式
F[i][j]:表示前i本书,拿j本的方案
F[i][j]=F[i-1][j]+F[i-1][j-1]

因为j比较大,我们可以用滚动数组,j=j% k
然后可以得到

答案就是f[n][0],我们只用求第一行就行了。
设,A为图中第一个矩阵,A矩阵是k*k,如果朴素求第一行的话,时间复杂度为k*k*logn,超时gg… 然后我们发现这个可以用NTT来加速
注意到A是循环矩阵
(什么是循环矩阵?类似于 a1a3a2a2a1a3a3a2a1 \begin{matrix}a1& a2 & a3 \\a3& a1 & a2 \\a2& a3 & a1 \\\end{matrix} 的矩阵)

如果A= a1a3a2a2a1a3a3a2a1 \begin{matrix}a1& a2 & a3 \\a3& a1 & a2 \\a2& a3 & a1 \\\end{matrix}
则A*A的第一行为(a1*a1+a2*a3+a3*a2 , a1*a2+a2*a1+a3*a3, a1*a3+a2*a2+a3*a1)
这个就是f(x)=a1+(a2)x+(a3)x2f(x)=a1+(a2)x+(a3)x^2的卷积模3为0,1,2的值
卷积就可以用NTT了~用NTT的总时间复杂度为O(k*logn*logk),当k为3e4时,为1e7,但k为3e5时就会超时。因为当k>3e4时,k只能为2的幂。一般去长度为k的循环卷积,肯定做的是>2k的FFT,来保证不会出错,但是如果k是2的次幂,就可以直接做长度为k的FFT,就可以直接变成点值之后快速幂。(yql教的:>)当k为2的幂次,时间大概是O(k*logn)

<从这个题中学到了很多,感谢yql~>
<基本上是yql的代码….>

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>using namespace std;
const int maxn = 600005;
#define mod  998244353
#define ll long long
int A[maxn],B[maxn],Ans[maxn],X[maxn];
ll n;int k;
int gg=3;int fexp(int x,int p){int ans=1;for(;p;p>>=1,x=1LL*x*x%mod)if(p&1)ans=1LL*ans*x%mod;return ans;}void NTT(int *a,int f,int k){for(int i=0,j=0;i<k;i++){if(i>j)swap(a[i],a[j]);for(int l=k>>1;(j^=l)<l;l>>=1);}for(int i=1;i<k;i<<=1){int w=fexp(gg,(f*(mod-1)/(i<<1)+mod-1)%(mod-1));for(int j=0;j<k;j+=i<<1){int e=1;for(int k=0;k<i;k++,e=1LL*e*w%mod){int x,y;x=a[j+k];y=1LL*a[j+k+i]*e%mod;a[j+k]=(x+y)%mod;a[j+k+i]=(x-y+mod)%mod;}}}if(f==-1){int _inv=fexp(k,mod-2);for(int i=0;i<k;i++)a[i]=1LL*a[i]*_inv%mod;}
}
void Work(){if((k&(-k))==k){NTT(X,1,k);NTT(Ans,1,k);for(;n;n>>=1){if(n&1) for(int i=0;i<k;i++) Ans[i]=1LL*Ans[i]*X[i]%mod;for(int i=0;i<k;i++) X[i]=1LL*X[i]*X[i]%mod;}NTT(Ans,-1,k);}else {int t;for(t=1;t<=(k*2);t<<=1);for(;n;n>>=1){if(n&1){for(int i=0;i<t;i++) A[i]=B[i]=0;for(int i=0;i<k;i++) A[i]=Ans[i],B[i]=X[i];NTT(A,1,t),NTT(B,1,t);for(int i=0;i<t;i++) A[i]=1LL*A[i]*B[i]%mod;NTT(A,-1,t);for(int i=0;i<t;i++) Ans[i]=0;for(int i=0;i<t;i++) Ans[i%k]=(Ans[i%k]+A[i])%mod;}for(int i=0;i<t;i++) A[i]=B[i]=0;for(int i=0;i<k;i++) A[i]=X[i];NTT(A,1,t);for(int i=0;i<t;i++) A[i]=1LL*A[i]*A[i]%mod;NTT(A,-1,t);for(int i=0;i<k;i++) X[i]=0;for(int i=0;i<t;i++) X[i%k]=(X[i%k]+A[i])%mod;}}printf("%d\n",Ans[0]);
}void init()
{Ans[0]=1;X[0]++,X[k-1]++;
}int main()
{scanf("%lld %d",&n,&k);init();Work();return 0;
}

玲珑杯 1160 - 康娜与玲珑杯相关推荐

  1. P3924 康娜的线段树(マジやばくね)(线段树、期望、前缀和)难度⭐⭐⭐★

    P3924 康娜的线段树 我觉得挺难的,マ(ma)ジ(ji)や(ya)ば(ba)く(ku)ね(ne)(不得了了)知道康娜的应该都懂 题解 P3924 [康娜的线段树] #include<iost ...

  2. P3924 康娜的线段树

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...

  3. 洛谷 P3924 康娜的线段树

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...

  4. 【题解】康娜的线段树

    题目 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害 ...

  5. 洛谷9月月赛 康娜的线段树

    题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常 ...

  6. 洛谷 P3924 康娜的线段树 解题报告

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...

  7. P3924 康娜的线段树(线段树+期望)

    题目 题目传送门\color{red} 题目传送门题目传送门 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段 ...

  8. Python语言实现龙女仆康娜酱字符飞出

    巧的是,女主小林编程用的语言也是Python,人生苦短,我用Python,模拟了动画的开始动画,下面先演示一下效果动态图: 下面上源代码: import time import osdef get(s ...

  9. 玲珑杯 Round #20

    1161 - 康娜的数学课 Time Limit:1s Memory Limit:256MByte Submissions:615Solved:221 DESCRIPTION 康娜上三年级了,老师要教 ...

最新文章

  1. 不用精子就能繁育后代,科学家只用1个卵细胞就培育出健康小鼠,来自上交医学院 | PNAS...
  2. ajax传递复杂参数
  3. python nameerror import_Python-ImportError:无法导入名称X
  4. 在lnmp1.3布置的web服务器上运行thinkphp3.2.3项目pathinfo路径模式
  5. 关于Xcode上的Other linker flags
  6. deepfake ai智能换脸_AI 换脸、声音篡改等,明确写入新版民法典!
  7. java基础之-I/O流和File类解析
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的个人记账管理系统
  9. scala类的序列化_Scala序列理解,通用类和内部类示例
  10. linux web目录写入权限命令,Linux下Web目录和文件安全权限设置
  11. 什么是驻点和拐点_拐点和驻点的区别有哪些
  12. java生成顺丰电子面单,顺丰拼多多电子面单设置教程
  13. python中 math.isfinite返回值为false_带有Python示例的math.isfinite()方法
  14. tkinter电子木鱼
  15. 个性篮球队名_你的篮球个性是什么
  16. 按照计算机名共享打印机,添加网络共享打印机
  17. Android消息传递机制总结
  18. 中国企业软件公司的转型之路
  19. 使用VS2012进行单元测试
  20. win10玩cf不能全屏_神奇的工作室ghost 不能启动

热门文章

  1. windows,cmd中进行盘符的切换
  2. tomcat启动报错javax.servlet.ServletException: It is not allowed to configure supportsCredentials=[true]
  3. 正则振型matlab,基于Matlab对结构自振周期和振型的求解
  4. 在NUC972上移植pjsip库并使用PJSUA测试VOIP电话(一)
  5. Jode java反编译 初识庐山真面目
  6. 变化检测综述 Deep learning for change detection in remote sensing images: comprehensive review and me
  7. mongodb数据存储大小
  8. 我的世界mod开发(3番外)自定义方块/物品模型
  9. 【渝粤教育】互联网营销概论
  10. 矩形脉冲信号合成_矩形脉冲信号的分解和合成