骰子
这题需要用到组合数;
—————————————————————————————————————
对于数论题,我们一般先观察题目有什么性质,我们观察样例发现,答案是对称的,因为两端的构造方案是一定的,例如2=1+1,2k=k+k,很好理解
然后我们又发现,对于一个偶数2c
可分成
(
1
,
2
c
−
1
)
(
2
,
2
c
−
2
)
…
…
(
c
,
c
)
(1,2c-1) (2,2c-2) …… (c,c)
(1,2c−1)(2,2c−2)……(c,c)
对于每种方案,我们给第二个数加上1的方案就是一种2*c+1的方案,并且一一对应
组
合
数
基
本
公
式
:
C
m
+
1
n
=
C
m
n
+
C
m
n
−
1
组合数基本公式: C_{m+1}^{n}=C_{m}^{n}+C_{m}^{n-1}
组合数基本公式:Cm+1n=Cmn+Cmn−1
这
个
公
式
其
实
是
为
了
递
推
,
有
m
+
1
个
时
我
们
希
望
将
m
+
1
缩
小
,
所
以
我
们
先
剔
除
一
个
,
这
一
个
可
能
选
,
也
可
能
不
选
,
选
它
的
方
案
就
是
在
剩
下
m
个
中
选
n
−
1
个
,
不
选
它
的
方
案
就
是
在
剩
下
m
个
中
选
n
个
这个公式其实是为了递推,有m+1个时我们希望将m+1缩小,所以我们先剔除一个,这一个可能选,也可能不选,选它的方案就是在剩下m个中选n-1个,不选它的方案就是在剩下m个中选n个
这个公式其实是为了递推,有m+1个时我们希望将m+1缩小,所以我们先剔除一个,这一个可能选,也可能不选,选它的方案就是在剩下m个中选n−1个,不选它的方案就是在剩下m个中选n个
————————————————————————————————————
接
下
来
我
们
就
只
需
要
枚
举
k
/
2
就
行
了
,
然
后
考
虑
统
计
方
案
数
,
考
虑
排
列
组
合
,
.
因
为
每
种
方
案
相
互
之
间
是
没
有
顺
序
的
,
即
1
,
2
和
2
,
1
,
算
一
种
方
案
,
我
们
先
算
出
总
方
案
,
因
为
无
序
,
则
表
示
我
们
只
算
排
序
后
不
同
的
方
案
,
那
不
妨
钦
定
原
来
的
序
列
是
非
严
格
单
调
递
增
的
,
那
么
方
案
总
数
就
是
C
n
+
k
−
1
k
−
1
,
即
有
k
个
桶
,
n
个
数
,
每
个
操
作
可
以
将
一
个
桶
打
掉
并
把
桶
中
的
数
往
右
放
(
即
一
开
始
就
没
有
这
个
桶
)
,
或
在
n
个
数
中
插
一
块
木
板
,
总
共
可
以
操
作
n
+
k
−
1
,
只
操
作
k
−
1
步
接下来我们就只需要枚举k/2就行了,然后考虑统计方案数,考虑排列组合,.因为每种方案相互之间是没有顺序的,即1,2和2,1,算一种方案,我们先算出总方案,因为无序,则表示我们只算排序后不同的方案,那不妨钦定原来的序列是非严格单调递增的,那么方案总数就是 C_{n+k-1}^{k-1},即有k个桶,n个数,每个操作可以将一个桶打掉并把桶中的数往右放(即一开始就没有这个桶),或在n个数中插一块木板,总共可以操作n+k-1,只操作k-1步
接下来我们就只需要枚举k/2就行了,然后考虑统计方案数,考虑排列组合,.因为每种方案相互之间是没有顺序的,即1,2和2,1,算一种方案,我们先算出总方案,因为无序,则表示我们只算排序后不同的方案,那不妨钦定原来的序列是非严格单调递增的,那么方案总数就是Cn+k−1k−1,即有k个桶,n个数,每个操作可以将一个桶打掉并把桶中的数往右放(即一开始就没有这个桶),或在n个数中插一块木板,总共可以操作n+k−1,只操作k−1步
然
后
对
于
一
个
方
案
,
其
中
又
不
合
法
的
方
案
,
对
于
一
个
p
,
不
合
法
的
序
列
当
且
仅
当
然后对于一个方案,其中又不合法的方案,对于一个p,不合法的序列当且仅当
然后对于一个方案,其中又不合法的方案,对于一个p,不合法的序列当且仅当
(
1
,
p
−
1
)
,
(
2
,
p
−
2
)
,
…
…
(
p
/
2
,
p
/
2
)
中
有
至
少
一
组
出
现
(1,p-1),(2,p-2),……(p/2,p/2)中有至少一组出现
(1,p−1),(2,p−2),……(p/2,p/2)中有至少一组出现
所
以
我
们
先
选
出
一
组
,
然
后
钦
定
它
一
定
会
选
,
则
这
种
方
案
一
定
是
不
合
法
的
方
案
,
但
是
这
样
会
多
减
去
一
些
方
案
,
所
以
还
要
加
上
一
些
东
西
,
用
一
下
容
斥
原
理
就
行
了
所以我们先选出一组,然后钦定它一定会选,则这种方案一定是不合法的方案,但是这样会多减去一些方案,所以还要加上一些东西,用一下容斥原理就行了
所以我们先选出一组,然后钦定它一定会选,则这种方案一定是不合法的方案,但是这样会多减去一些方案,所以还要加上一些东西,用一下容斥原理就行了
将
C
i
+
k
−
1
k
−
1
即
为
s
u
m
[
i
]
,
a
n
s
=
s
u
m
[
i
]
−
C
i
/
2
1
s
u
m
[
i
−
1
]
+
C
i
/
2
2
s
u
m
[
i
−
4
]
+
.
.
.
.
.
.
将C_{i+k-1}^{k-1}即为sum[i],ans=sum[i]-C_{i/2}^{1}sum[i-1]+C_{i/2}^{2}sum[i-4]+......
将Ci+k−1k−1即为sum[i],ans=sum[i]−Ci/21sum[i−1]+Ci/22sum[i−4]+......
#include<bits/stdc++.h>
using namespace std;
const int N=4010;/*数组一定要开两倍,因为要计算ans[2*k]*/
typedef long long ll;/*由于mod>INT_MAX,所以记录的答案一定是long long范围内*/
ll n,k,ans[N],c[2*N][N],sum[N];
ll mod=998244353;
ll ksm(int x,int pow){
ll ans=1,res=x;
while(pow){
if(pow&1) ans=ans*res%mod;
res=res*res%mod;
pow>>=1;
}
return ans;
}
int main(){
scanf("%lld%lld",&k,&n);c[1][0]=c[1][1]=1;
for(ll i=2;i<=n+k-1;i++){
c[i][i]=1;c[i][0]=1;
for(ll j=1;j<i;j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
for(ll i=0;i<=n;i++){
sum[i]=c[i+k-1][k-1];
}
for(ll i=2;i<=k+1;i+=2){
ll f=1;
for(ll j=n;j>=0;j-=2){
ans[i]=(((c[i/2][((n-j))/2]*(sum[j])%mod*f)+ans[i])%mod+mod)%mod;
f*=-1;
}
ans[2+2*k-i]=ans[i];
if(!ans[i+1]) ans[i+1]=ans[i],ans[2+2*k-i-1]=ans[i+1];/*边界区间一定要特判*/
}
for(ll i=2;i<=2*k;i++){
printf("%lld\n",ans[i]);
}
}

本文探讨了一类数论问题的解决策略,利用组合数和递推公式,结合容斥原理,阐述了如何计算特定数学问题的解的数目。通过对样例的观察和分析,提出了一种高效的方法来枚举和统计方案数。
206

被折叠的 条评论
为什么被折叠?



