洛谷题面传送门

一道题解长度大概不到 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(循环卷积)的更多相关文章

  1. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  2. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  3. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  4. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  5. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  6. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  7. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  8. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

  9. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

随机推荐

  1. 对cpu与load的理解及线上问题处理思路

    cpu如何计算 当我们执行top命令的时候,看到里面的值(主要是cpu和load)值是一直在变的,因此有必要简单了解一下Linux系统中cpu的计算方式. cpu分为系统cpu和进程.线程cpu,系统 ...

  2. wget命令8种实用用法

    大家好,我是良许. wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上. 这实际上也是大家所使用的浏览器所做的 ...

  3. ThreadLocalRandom类原理分析

    1.Random类及其局限性 public int nextInt(int bound) { if (bound <= 0) throw new IllegalArgumentException ...

  4. UltraSoft - Beta - Scrum Meeting 11

    Date: May 27th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录会议 Liuzh 前端 增加了对重复日程的支持 Kkkk 前端 测试验证前后端 ...

  5. Unity 制作不规则形状button

    在游戏开发中,我们有时需要制作不规则形状的按键. Unity3d中使用UGUI的Button控件只能实现规则的长方形按钮.而通过给Button的Image组件添加对应的贴图(sprite)我们可以实现 ...

  6. Noip模拟71 2021.10.7

    T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...

  7. CSP2021 翻车记

    DAY - INF 日常模拟赛被吊打,不知道为啥总是出一些小问题导致正解gg,成绩的话也就是中游吧,不过方差不小 DAY - 2 感冒了,头疼得很,签到题甚至也签到失败了,烦得很 DAY -1 全真体 ...

  8. Spring IOC(控制反转)和DI(依赖注入)原理

    一.Spring IoC容器和bean简介 Spring Framework实现了控制反转(IoC)原理,IoC也称为依赖注入(DI). 这是一个过程,通过这个过程,对象定义它们的依赖关系,即它们使用 ...

  9. 最详细的windows10系统封装教程

    目录 自定义封装(定制)windows10教程 关于本教程及用到的工具的声明 第一阶段: 封装前的各种环境准备 安装vmware 创建虚拟机 对虚拟机进行分区 配置好BIOS 为虚拟机安装window ...

  10. Codeforces Round #736 (Div. 2)

    A,B,C就不说了,又被D题卡住了..... 感觉怎么说呢,就是题解中的三个提示都已经想到了,就是不知道该怎么解决.... D. Integers Have Friends 简述题意:题目要求你找一个 ...