站外题 75pts,求优化思路
  • 板块灌水区
  • 楼主stringdp100005
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/2/6 14:50
  • 上次更新2025/2/8 10:19:47
查看原帖
站外题 75pts,求优化思路
1330274
stringdp100005楼主2025/2/6 14:50

题目描述

一天 sx 经过一家商店,他看中 nn 个物品,在某些强大的力量的帮助下,sx 获得了如下优惠:每个物品价格均为 11 ,如果选择两个相邻的物品,会优惠 11 元,但同一个物品不能被同时选择两次。由于 sx 手头上的钱只有 mm 块钱,因此对于某些物品,sx 可能不买。现在 sx 想知道对于所有的 k[0,m]k∈[0,m],购买的价格恰好为 kk 的方案数,答案对 998244353998244353 取模。

不同方案的定义:设用方式1购买的单个物品的集合为 S1S1,方式2的 物品对 集合为 S2S2,在价格为 kk 的情况下,两种方案对应的集合 S1S1S2S2 至少有一者不同。

输入格式

第一行一个正整数 QQ,表示数据的组数。 接下来 QQ 行两个正整数 nn, mm
注意:测试点包含多组数据

输出格式

一共 QQ 行,每行 m+1m+1 个整数,第 kk 个整数表示当购买的价钱恰好为 kk 时的方案数。

数据范围

2n109,m1032\le n\le 10^9,\sum m\le10^3

#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,n,m,ans;
const int mod=998244353;
int qpow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
int C(int x,int y){
	int fac=1;
	for(int i=1;i<=y;i++) fac=fac*i%mod;
	int res=qpow(fac,mod-2);
	for(int i=x-y+1;i<=x;i++) res=res*i%mod;
	return res;
}
signed main(){
	cin>>q;
	while(q--){
		cin>>n>>m;
		for(int i=0;i<=m;i++){
			ans=0;
			for(int j=0;j<=min(i,n-i);j++)
				ans=(C(n-j,i)*C(i,j)+ans)%mod;
			cout<<ans<<" ";
		}
		cout<<"\n";
	}
    return 0; 
}
2025/2/6 14:50
加载中...