骰子

37 篇文章 1 订阅

骰子
这题需要用到组合数;
—————————————————————————————————————
对于数论题,我们一般先观察题目有什么性质,我们观察样例发现,答案是对称的,因为两端的构造方案是一定的,例如2=1+1,2k=k+k,很好理解
然后我们又发现,对于一个偶数2
c
可分成
( 1 , 2 c − 1 ) ( 2 , 2 c − 2 ) … … ( c , c ) (1,2c-1) (2,2c-2) …… (c,c) 12c122c2c,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+Cmn1
这 个 公 式 其 实 是 为 了 递 推 , 有 m + 1 个 时 我 们 希 望 将 m + 1 缩 小 , 所 以 我 们 先 剔 除 一 个 , 这 一 个 可 能 选 , 也 可 能 不 选 , 选 它 的 方 案 就 是 在 剩 下 m 个 中 选 n − 1 个 , 不 选 它 的 方 案 就 是 在 剩 下 m 个 中 选 n 个 这个公式其实是为了递推,有m+1个时我们希望将m+1缩小,所以我们先剔除一个,这一个可能选,也可能不选,选它的方案就是在剩下m个中选n-1个,不选它的方案就是在剩下m个中选n个 m+1m+1mn1mn
————————————————————————————————————
接 下 来 我 们 就 只 需 要 枚 举 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,22,1Cn+k1k1,knnn+k1k1
然 后 对 于 一 个 方 案 , 其 中 又 不 合 法 的 方 案 , 对 于 一 个 p , 不 合 法 的 序 列 当 且 仅 当 然后对于一个方案,其中又不合法的方案,对于一个p,不合法的序列当且仅当 p,
( 1 , p − 1 ) , ( 2 , p − 2 ) , … … ( p / 2 , p / 2 ) 中 有 至 少 一 组 出 现 (1,p-1),(2,p-2),……(p/2,p/2)中有至少一组出现 (1,p1),(2,p2),(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+k1k1sum[i]ans=sum[i]Ci/21sum[i1]+Ci/22sum[i4]+......

#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]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值