标签:time pat amp pre 编号 line a* bit names
给定 $ 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();}
标签:time pat amp pre 编号 line a* bit names
原文地址:https://www.cnblogs.com/rikurika/p/13287610.html