YACS 2023年8月月赛 甲组 T1 不定方程 题解
背包
首先想到背包,
如果背包跑的时候只跑到当前的
插板法
先来考虑一个更简单的问题,每个
这样就是答案了吧,所以没有上界时的答案为
上界相同的解法
如果对于每个
答案就是只有下界的方案数-有一个越界剩下只有下界的方案数+有两个越界剩下只有下界的方案数-有三个越界剩下只有下界的方案数......
其中有
上界不同的解法
直接进行容斥原理
但容易发现即使
代码:
#include<iostream> #define int long long using namespace std; int n,m; int a[21],fac[20000001]; const int mod=1000000007; int q_pow(int x,int y){ if(y==0)return 1; if(y&1)return x*q_pow(x*x%mod,y>>1)%mod; return q_pow(x*x%mod,y>>1); } int inv(int x){return q_pow(x,mod-2);} int C(int n,int m){ if(n<m)return 0; if(n==m)return 1; return fac[n]*inv(fac[m])%mod*inv(fac[n-m])%mod; } int dfs(int x,int r){ //x:目前是第几个 //r:目前还有几个 1 没分配 if(x==n+1)return C(r-1,n-1); return (dfs(x+1,r)-dfs(x+1,r-a[x])+mod)%mod; } signed main(){ fac[0]=1; for(int i=1;i<=20000000;i++)fac[i]=fac[i-1]*i%mod; cin>>n>>m; if(m>20000000){ cout<<0; return 0; } for(int i=1;i<=n;i++)cin>>a[i]; cout<<dfs(1,m); return 0; }
分类:
YACS甲组月赛题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异