题解 洛谷 P1641 【[SCOI2010]生成字符串】
生成字符串
前置知识
组合数、坐标轴。
题目描述
以
解题思路
考虑到题目要求的条件「
举例说明:
第一步:建系。将
因为
第二步:排除不合法情况:
我们考虑将在到达
折线的新起点变为
第三步:综合前两步的推导,得出式子:
注意事项
参考程序
#include<bits/stdc++.h>
#define re register
#define il inline
#define ll long long
#define MAXN 1000005
#define MAXM 1000005
#define MOD 20100403
#define rep(i,a,b) for(re int i = a;i <= b;i ++)
#define drep(i,a,b) for(re int i = a;i >= b;i --)
#define Rep(i,a,b) for(re int i = a;i < b;i ++)
#define Drep(i,a,b) for(re int i = a;i > b;i --)
#define fin(a) freopen(#a".in","r",stdin)
#define fout(a) freopen(#a".out","w",stdout)
using namespace std;
il ll read(){
ll x = 0;
char ch = 0;
while(!isdigit(ch)){
ch = getchar();
}
while(isdigit(ch)){
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return x;
}
il void write(ll x){
if(x > 9){
write(x / 10);
}
putchar(x % 10 + '0');
}
il ll Pow(ll a,ll b){
ll ans = 1;
while(b){
if(b & 1)
ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ans % MOD;
}
il ll C(ll n,ll m){
if(m > n)
return 0;
if(m > n - m)
m = n - m;
ll s1 = 1,s2 = 1;
Rep(i,0,m){
s1 = s1 * (n - i) % MOD;
s2 = s2 * (i + 1) % MOD;
}
return s1 * Pow(s2,MOD - 2) % MOD;
}
il ll Lucas(int n,int m){
if(!m)
return 1;
return C(n % MOD,m % MOD) * Lucas(n / MOD,m / MOD) % MOD;
}
int main(){
#ifndef ONLINE_JUDGE
fin(1641);
fout(1641);
#endif
int n = read(),m = read();
write((Lucas(n + m,n) % MOD - Lucas(n + m,m - 1) % MOD + MOD) % MOD);
return 0;
}
分类:
题解 Solutions
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】