洛谷 P5224 - Candies(循环卷积)
一道题解长度大概不到 1k 的题,可还是决定写篇题解,因为自己没有做出来(
\(1004535809\) 好评(
首先这个 \(\equiv m\pmod{k}\) 有点把我们往单位根反演的方向思考的意思,不过注意到 \(k\) 不一定是 \(1004535808\) 的约数,因此在多数情况下 \(k\) 次单位根是不存在的,因此我们只能放弃这个想法。
然后我便想着如何裂组合数,发现裂了之后还要再裂,如此不停递归下去,进而获得了复杂度优秀的 \(\mathcal O(nk)\) 的做法。看了题解才发现自己是多么 sb……
注意到这个组合数很容易让我们与二项式产生联想,具体来说 \(\dbinom{n}{i}=[x^i](1+x)^n\),而比较巧的一点是我们求和的组合数中所有组合数的上部都是相同的,也就是说答案就是 \((1+x)^n\) 中所有次数 \(\bmod k=m\) 的项的系数之和。看到次数 \(\bmod k\) 又能让我们发生怎样的联想呢?……循环卷积!我们考虑求 \((1+x)^n\) 时,对次数做 \(\bmod k\) 意义下的循环卷积,这样最终答案就是求得的长度为 \(k\) 的多项式中,\(x^m\) 前的系数。注意到 NTT 是可以解决循环卷积问题的,因此 NTT+循环卷积即可。
又帮我复习了一个 9 个月前学的东西(bushi,因为这东西大概 3 个月后还要再次学到)
const int MAXP=32768;
const int pr=3;
const int ipr=(MOD+1)/3;
void add(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
int qpow(int x,int e){
	int ret=1;
	for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
	return ret;
}
ll n;int m,K,rev[MAXP+5];
void NTT(vector<int> &a,int len,int type){
	int lg=31-__builtin_clz(len);
	for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
	for(int i=0;i<len;i++) if(rev[i]<i) swap(a[i],a[rev[i]]);
	static int pw_W[MAXP+5];pw_W[0]=1;
	for(int i=2;i<=len;i<<=1){
		int W=qpow((type<0)?ipr:pr,(MOD-1)/i);
		for(int j=((i>>1)-2);j>=0;j-=2) pw_W[j+1]=1ll*(pw_W[j]=pw_W[j>>1])*W%MOD;
		for(int j=0;j<len;j+=i){
			for(int k=0;k<(i>>1);k++){
				int X=a[j+k],Y=1ll*a[(i>>1)+j+k]*pw_W[k]%MOD;
				a[j+k]=(X+Y>=MOD)?(X+Y-MOD):(X+Y);
				a[(i>>1)+j+k]=(X-Y<0)?(X-Y+MOD):(X-Y);
			}
		}
	}
	if(!~type){
		int ivn=qpow(len,MOD-2);
		for(int i=0;i<len;i++) a[i]=1ll*a[i]*ivn%MOD;
	}
}
vector<int> conv(vector<int> a,vector<int> b){
	int LEN=1;while(LEN<a.size()+b.size()) LEN<<=1;
//	printf("A: ");for(int i=0;i<a.size();i++) printf("%d%c",a[i]," \n"[i+1==a.size()]);
//	printf("B: ");for(int i=0;i<b.size();i++) printf("%d%c",b[i]," \n"[i+1==b.size()]);
	a.resize(LEN,0);b.resize(LEN,0);NTT(a,LEN,1);NTT(b,LEN,1);
	for(int i=0;i<LEN;i++) a[i]=1ll*a[i]*b[i]%MOD;NTT(a,LEN,-1);
//	printf("mul: ");for(int i=0;i<a.size();i++) printf("%d%c",a[i]," \n"[i+1==a.size()]);
	while(a.size()>K){
		int pos=(int)(a.size())-1;
		add(a[pos%K],a[pos]);a.ppb();
	} return a;
}
int main(){
	scanf("%lld%d%d",&n,&m,&K);
	vector<int> res(1,1),trs(2,1);
	for(;n;n>>=1,trs=conv(trs,trs)) if(n&1) res=conv(res,trs);
	if(m>=res.size()) printf("0\n");
	else printf("%d\n",res[m]);
	return 0;
}
												
											洛谷 P5224 - Candies(循环卷积)的更多相关文章
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
		
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
 - 洛谷P1352  codevs1380 没有上司的舞会——S.B.S.
		
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
 - 洛谷P1108 低价购买[DP | LIS方案数]
		
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
 - 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
		
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
 - 洛谷P1710 地铁涨价
		
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
 - 洛谷P1371 NOI元丹
		
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
 - 洛谷P1538迎春舞会之数字舞蹈
		
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
 - 洛谷八月月赛Round1凄惨记
		
个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...
 - 洛谷 P1379 八数码难题 Label:判重&&bfs
		
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
 
随机推荐
- part1 软件测试基础知识面试题(含答案)
			
1.你的测试职业发展是什么? 测试经验越多,测试能力越高.所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去.而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求 ...
 - Java继承、重写与重载
			
1.java继承 1.1概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 继承可以使用extends和implem ...
 - Python爬虫:给我一个链接,快手视频随便下载
			
前言 讲一下,文明爬虫,从我做起(1.文章中的程序代码仅供学习,切莫用于商业活动,一经被相关人员发现,本小编概不负责!2.请在服务器闲时运行本程序代码,以免对服务器造成很大的负担.) 1. 实现原理 ...
 - makedown笔记
			
makedown语法 表格 这个表格的主题 |姓名|性别|年龄|职业| | ----- | ----- | ----- | ----- | |张三|男|34|码农| |李四|男|27|代驾| 这个表格 ...
 - CICD 流水线就该这么玩系列之一
			
今天给大家分享的是 DevOps 世界中非常流行的一个 GitOps 工具 - Argo CD.如果你还不知道什么是 GitOps,欢迎留言告诉我,根据热度,我会再写一篇详细讲解 GitOps 的文章 ...
 - (二)、Docker 快速入门
			
文档:https://docs.docker.com/install/linux/docker-ce/centos/ 中文文档:https://docs.docker-cn.com/engine/in ...
 - 洛谷 P3232 [HNOI2013]游走
			
链接: P3232 题意: 和上次考试 T4 的简化且无修改一样,经典图上高斯消元求期望. 分析: 要求出每个点的期望出发次数 \(f_i\),每个点度数为 \(d_i\),有 \[f1=\sum\d ...
 - Android WebView 实现文件选择、拍照、录制视频、录音
			
原文地址:Android WebView 实现文件选择.拍照.录制视频.录音 | Stars-One的杂货小窝 Android中的WebView如果不进行相应的设置,H5页面的上传按钮是无法触发And ...
 - Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)
			
序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...
 - 记一次,因表变量导致SQL执行效率变慢
			
场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析 首先,对于JO ...