码迷,mamicode.com
首页 > 其他好文 > 详细

某某天的模拟赛题 IOer(组合数学)

时间:2020-07-12 12:14:33      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:time   pat   amp   pre   编号   line   a*   bit   names   

某某天的模拟赛题 IOer(组合数学)

题意

给定 $ n,m,u,v $ ,

设 $ t_{i} = ui+v $ ,

求 $ \sum_{ \sum_{ i = 1 } ^ {m} { k_{i} =n} } { \prod { {t_{i}} ^ {k_{i}} } } $ 。

$ 1 \le n \le 10^{18} , 1 \le m \le 2 \times 10^{5} , 1 \le u,v \le 10^{9} $ 。

题解

考虑有 $ m $ 种编号 $ 0 \sim m-1 $ 的球。

其中 $ 0 $ 号球有 $ u+v $ 种颜色,其余有 $ u $ 种颜色。

原题类似于 $ n $ 长的区间内放满这些球。

考虑增加 $ m-1 $ 个球作为没有实际意义的分界点。

然后这个序列正整数标号的球要求是最小表示法。

然后直接容斥算出来后除掉排列 $ (m-1)! $ 和多出来的球 $ u^{m-1} $ 就结束了。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
	TP ret=0,f=1;char ch=getchar();
	while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){ret=ret*10+(ch-‘0‘);ch=getchar();}
	tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=200011;
const int mo=998244353;
int fix(int a){return a<0?a+mo:a;}
void doadd(int &a,int b){if((a+=b)>=mo) a-=mo;}int add(int a,int b){return (a+=b)>=mo?a-mo:a;}
void domul(int &a,int b){a=1ll*a*b%mo;}int mul(int a,int b){return 1ll*a*b%mo;}
int fpow(int a,int p){int ret=1;while(p){if(p&1) domul(ret,a);domul(a,a),p>>=1;}return ret;}
int fac[N],ifac[N],inv[N];
void init()
{
	inv[1]=1;for(int i=2;i<=200000;i++) inv[i]=mul(inv[mo%i],mo-mo/i);
	for(int i=fac[0]=ifac[0]=1;i<=200000;i++)
		fac[i]=mul(fac[i-1],i),ifac[i]=mul(ifac[i-1],inv[i]);
}
int C(int n,int m){if(n<0||m<0||n<m) return 0;return mul(fac[n],mul(ifac[m],ifac[n-m]));}
int TAT;
lint n;int m,u,v;
int main()
{
	freopen("ioer.in","r",stdin),freopen("ioer.out","w",stdout);
	init();read(TAT);while(TAT--)
	{
		read(n,m,u,v);int ans=0;
		for(int i=0;i<m;i++)
			doadd(ans,fix((i&1?-1:1)*mul(C(m-1,i),fpow(((lint)v+1ll*(m-i)*u)%mo,(n+m-1)%(mo-1)))));
		printf("%d\n",mul(ans,mul(fpow(u,mo-m),ifac[m-1])));
	}
	return 0;
}
}
int main(){return RKK::main();}

某某天的模拟赛题 IOer(组合数学)

标签:time   pat   amp   pre   编号   line   a*   bit   names   

原文地址:https://www.cnblogs.com/rikurika/p/13287610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!