Noi.ac #65题解

题目链接

\(Solution:\)

\(a,b\)表示数,推一推,容易得到题设中的三角形即为
\(1\)
\(a\) \(b\)
\(a^2\) \(2ab\) \(b^2\)
\(a^3\) \(3a^2b\) \(3ab^2\) \(a^3\)
...
容易看出它就是个帕斯卡三角形,直接组合数一波就没了
证明?自证不难(反正我不会)
其实感性理解起来也是挺显然的嘛\(QwQ\)
粗略地证明一下:
如果题目中不含\(a,b\),则由递推式可知即为帕斯卡三角
再考虑\(a,b\)的影响:对于\(f_{i,j}\)\(a,b\)分别被计算了\(n-1,n-m\)次,所以答案就是\(C_n^ma^{n-1}b^{n-m}\)
还要注意一下,这道题需要线性求逆元

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
namespace my_std
{
	typedef long long ll;
	typedef double db;
	const db PI=acos(-1.0);
	#define cp complex<db>
	#define MP make_pair
	#define fir first
	#define sec second
	#define fr(i,x,y) for(ll i=(x);i<=(y);i++)
	#define pfr(i,x,y) for(ll i=(y);i>=(x);i--)
	#define gfr(u) for(ll i=head[u];i;i=e[i].nxt)
	#define pf prllf
	inline ll read()
	{
		ll sum=0,f=1;
		char ch=0;
		while(!isdigit(ch))
		{
			if(ch=='-') f=-1;
			ch=getchar();
		}
		while(isdigit(ch))
		{
			sum=(sum<<1)+(sum<<3)+(ch^48);
			ch=getchar();
		}
		return sum*f;
	}
	inline void write(ll x)
	{
	    if(x<0)
		{
	    	putchar('-');
			x=-x;
		}
	    if(x>9) write(x/10);
	    putchar(x%10+'0');
	}
}
using namespace my_std;
const ll N=1e5+10,mod=1e9+9;
ll t,n,m,a,b,mul[N],inv[N];
inline ll ksmod(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=(ans*a)%mod;
		}
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}
inline ll C(ll n,ll m)
{
	if(m>n) return 0;
    ll res=inv[m]*inv[n-m]%mod;
    res=res*mul[n]%mod;
    return res;
}
int main(void)
{
	mul[0]=inv[0]=1;
    for(ll i=1;i<=N;i++) mul[i]=mul[i-1]*i%mod;
    inv[N]=ksmod(mul[N],mod-2);
    for(ll i=N-1;i;i--) inv[i]=inv[i+1]*(i+1)%mod;
	t=read();
	while(t--)
	{
		a=read(),b=read(),n=read(),m=read();
		write((((C(n-1,m-1)%mod)*ksmod(a,n-m)%mod)*ksmod(b,m-1)%mod)%mod);
		putchar('\n');
	}
	return 0;
}
posted @ 2020-02-19 21:07  L_G_J  阅读(175)  评论(0编辑  收藏  举报