洛谷 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来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
随机推荐
- javascript-jquery插件
1.jquery创建插件 jQuery.extend({插件名:函数体,插件名:函数体}): html部分 <div id="div1">开始动画</div> ...
- [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 训 ...
- 5.27日Scrum Metting
日期:2021年5月27日 会议主要内容概述:确定账单数据格式,确定需要添加新的图表,确定模板分享功能任务量. 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 ...
- PCB板HDI板几阶是什么意思
http://blog.sina.com.cn/s/blog_55ff6d5d0102xxvx.html
- MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis
一.介绍JDBC JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库. JDBC的三层架构图: JDB ...
- 『学了就忘』Linux基础 — 13、Linux系统的分区和格式化
目录 1.Linux系统的分区 (1)磁盘分区定义 (2)两种分区表形式 (3)MBR分区类型 2.Linux系统的格式化 (1)格式化定义 (2)格式化说明 1.Linux系统的分区 (1)磁盘分区 ...
- nod_1004 n^n的末位数字(二分快速幂)
题意: 给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字. Input 一个数N(1 <= N <= 10^9) OutPut 输出N^N的末位数字 思路: EASY,,,, ...
- [python]django关闭debug
1.版本声明 python3.6.5 django2.0.6 2.打开项目-setting setting.py中DEBUG默认是等于True,这样的话当访问接口存在错误会直接展示项目的所有配置信息, ...
- django test, app aren't loaded yet
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 解决方法: 用django的TestCase from djan ...
- django improperly configured
ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...