题目背景
JerryC有一大袋糖果,他正以1\ t/ms1 t/ms的速度食用着这一袋糖果…

题目描述
JerryC的糖果有NN箱(两两之间不同)。他一开始想挑MM箱出来,但是觉得吃起来不过瘾,所以又想要多拿一些出来。由于他比较喜欢数字KK,所以只要拿出来的糖的量x(x \ge M)x(x≥M)满足:x \equiv M\ (\bmod\ K)x≡M (mod K),JerryC就会得到满足感。

求有多少种方案使得JerryC得到满足感。请输出方案数\bmod\ 1004535809mod 1004535809的结果。

输入格式
一行三个非负整数NN,MM,KK。

输出格式
一行一个非负整数,表示方案数\bmod\ 1004535809mod 1004535809的结果。

输入输出样例
输入 #1复制
10 2 3
输出 #1复制
342
说明/提示
样例解释:

可以拿出来:2箱 5箱 8箱,组合数算一下就是了:

\binom{10}{2}+\binom{10}{5}+\binom{10}{8}=342( 210 )+( 510 )+( 810)=342数据范围:

测试点编号 N\leN≤ K\leK≤
11 11 11
2-32−3 10^610
6
1010
4-84−8 10^{12}10
12
100100
9-129−12 10^{15}10
15
10^310
3

12-2012−20 10^{18}10
18
10^410
4

0 \leq M < K
0≤M<K

其实这道题就是循环卷积,求的就是(1+x) nmod(x k−1)。
看完题后直接可以列出公式
(1+x) n=i=0∑n( in​)x i
这时候把指数模上k后所得结果相同的列在一起就是答案了.
本算法的时间复杂度 O(k\log k\log n)O(klogklogn)
特殊情况下(k为2的幂次方或其他特殊情况时)为 O(k\log k)O(klogk)

代码

#include<bits/stdc++.h>
#define ll long long
#define N 400007
#define reg register
#define p 1004535809
using namespace std;struct poly{int a[N];int t;
};int rev[N];
int inv;inline int power(int a,int t){int res = 1;while(t){if(t&1) res = (ll)res*a%p;a = (ll)a*a%p;t >>= 1;}return res;
}inline void NTT(poly &f,int type,int lim){for(reg int i=1;i<=lim;++i){if(i>=rev[i]) continue;swap(f.a[i],f.a[rev[i]]);}reg int w,r,x,y,rt;for(reg int mid=1;mid<lim;mid<<=1){r = mid<<1;rt = power(3,(p-1)/r);if(type==-1) rt = power(rt,p-2);for(reg int j=0;j<lim;j+=r){w = 1;for(reg int k=0;k<mid;++k){x = f.a[j+k];y = (ll)w*f.a[j+k+mid]%p;f.a[j+k] = (x+y)%p;f.a[j+k+mid] = (x-y+p)%p;w = (ll)w*rt%p;}}}
}ll n;
int m,k,lim,l;
poly F;poly power(poly f,ll n){poly g,h;g.t = f.t;memset(g.a,0,sizeof(g.a));g.a[0] = 1;while(n){if(n&1){h = f;NTT(h,1,lim),NTT(g,1,lim);for(reg int i=0;i<=lim;++i)g.a[i] = (ll)g.a[i]*h.a[i]%p;NTT(g,-1,lim);for(reg int i=0;i<=lim;++i)g.a[i] = (ll)g.a[i]*inv%p;for(reg int i=k;i<=lim;++i){g.a[i%k] = (g.a[i%k]+g.a[i])%p;    g.a[i] = 0;}} n >>= 1;if(!n) break;NTT(f,1,lim);for(reg int i=0;i<=lim;++i)f.a[i] = (ll)f.a[i]*f.a[i]%p;NTT(f,-1,lim);for(reg int i=0;i<=lim;++i)f.a[i] = (ll)f.a[i]*inv%p;for(reg int i=k;i<=lim;++i){f.a[i%k] = (f.a[i%k]+f.a[i])%p;f.a[i] = 0;}    }return g;
}signed main(){ scanf("%lld%d%d",&n,&m,&k);lim = 1,l = -1;while(lim<=(k<<1)){lim <<= 1;++l;}inv = power(lim,p-2);for(reg int i=1;i<=lim;++i) rev[i] = (rev[i>>1]>>1)|((i&1)<<l);F.t = lim;F.a[0] = F.a[1] = 1;    F = power(F,n);printf("%d",F.a[m]);return 0;
}

P5224 Candies相关推荐

  1. K - Candies POJ - 3159(利用了自定义比较操作符)

    K - Candies POJ - 3159 题意: 孩子 A 觉得 B 得到的糖果不能比自己多超过 c,求 n 比 1 最多能多几颗糖果 思路:DJ,松弛条件: sweet[A] > swee ...

  2. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  3. 575. Distribute Candies 平均分糖果,但要求种类最多

    [抄题]: Given an integer array with even length, where different numbers in this array represent diffe ...

  4. 1431. Kids With the Greatest Number of Candies

    Title 给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目. 对每一个孩子,检查是否存在一种方案,将额外的 extr ...

  5. HDU - 6126 Give out candies

    Give out candies 题解: 第一次遇见这样处理的网络流模型. 将问题转换成最小割问题. 具体的题解参考自:传送门 先将每个人的拆成m个人. 然后s向第1人连边流量为inf.第i个人向第i ...

  6. CF思维联系– CodeForces - 991C Candies(二分)

    ACM思维题训练集合 After passing a test, Vasya got himself a box of n candies. He decided to eat an equal am ...

  7. poj 2886 Who Gets the Most Candies?(线段树)

    题目链接:poj 2886 Who Gets the Most Candies? 题目大意:N个人围成一圈玩约瑟夫环游戏,不同的是.步长不固定,由前一个出局的人决定.给定K表示起始的人. 第i个淘汰的 ...

  8. POJ 3159 Candies(差分约束+SPAF)

    题意: 给n个小朋友分发糖果,但小朋友们之间有嫉妒心.接下来m行,每行三个数,分别表示小朋友A希望B得到的糖果不能比他多x个.要求你计算在满足所有小朋友的条件的情况下最多需要准备多少颗糖. 题目: D ...

  9. 1189C. Candies

    C. Candies:题目 思维题,我是笨蛋.我看了半天也没想明白怎么dp,可恶啊. #include <bits/stdc++.h> using namespace std; #defi ...

最新文章

  1. office excel Query 功能
  2. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解
  3. lnmp php fpm 默认,LNMP(PHP-FPM)
  4. Java开发程序员最值得学习的10大技术
  5. 4 int.parse方法调用问题和同行评审
  6. WPF 凭证分录控件
  7. python处理分组_Python中的groupby分组功能的实例代码
  8. 解决Unity中文显示乱码问题
  9. python+jpype+linux出现内存溢出问题解决方案
  10. Android启动模式分析
  11. 报错Exception opening port “18080“ (port may be in use), cause: “java.net.BindException: Address alrea
  12. 《 Matlab_Simulink动力学系统建模仿真》及 ‘///’动力学 达朗贝尔原理、虚位移原理、朗格朗日方程...
  13. 1761:神奇的口袋(2)
  14. 学生请假管理系统(jsp+servlet)
  15. 随机变量不相关却不一定独立
  16. 计算机视觉技术的基础知识,计算机视觉及导航技术基础.pdf
  17. 【Docker】安装mysql,redis
  18. 求2个数的最小公倍数
  19. mysql主从和mycat读写分离的安装及验证
  20. matlab空心变实心点,原 控制台输出圆形(实心,空心)

热门文章

  1. uushare第二版功能详细介绍
  2. ip route内容详解
  3. 运筹系列76:mps文件的读取与展示
  4. TWaver可视化软件(四)电力可视化 上
  5. 中国数字化转型为全球带来机遇
  6. “雪亮工程”实现大数据“千里眼”
  7. SQL Server Profiler 简单使用说明
  8. Python爬取虎牙直播数据并分析
  9. cocos 3d 3.0《懒猫跑酷》实战开发 01 场景搭建
  10. Linux---用户和组