2020 计蒜客信息学 2 月提高组模拟赛 A 受力平衡(组合数学题) B 保护水库(定期重构)

题目链接

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=2e6+10;
ll powmod(ll a,ll b)
{
    ll res=1;
    for(;b;b>>=1){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
    }
    return res;
}
ll f[N];
ll C(ll n,ll m)
{
    ll fz=f[n],fm=f[m]*f[n-m]%mod;
    return fz*powmod(fm,mod-2)%mod;
}
int main()
{
    f[0]=1;
    for(int i=1;i<N-5;++i) f[i]=f[i-1]*i%mod;
    
    int _;cin>>_;while(_--)
    {
        ll n,m;
        scanf("%lld%lld",&n,&m);
        printf("%lld\n",(C(n+m,m)-1+mod)%mod);
    }
    return 0;
}

B-保卫水库

这是一道定期重构题....题解感觉讲的很清楚了。

#include<bits/stdc++.h>

#define mod 998244353ll
typedef long long ll;
using namespace std;
const int N=5e3+10;
ll f[N][N],dp[N],v0[N],v[N],sz[N];
int n, m, k;

vector<int>G[N];
void DP()
{
	for(int i=1;i<=n;i++)dp[i]=0;
	for(int i=n;i;i--)
	{
		ll t=((dp[i]%=mod)+v[i])*sz[i]%mod;
		for(int j=0;j<G[i].size();++j) {
			dp[G[i][j]]+=t;
		}
	}
}
ll powmod(ll a,ll b){ll res=1;for(;b;b>>=1){
if(b&1) res=res*a%mod;a=a*a%mod;}return res;}
ll tot,lis[N],add[N],S;

int main()
{
	ll i, j, type, x, y;
	scanf("%d%d%d",&n,&m,&k);
	S=sqrt(n+m);
	for(i=1;i<=n;i++)scanf("%lld",&v0[i]);
	for(i=1;i<=m;i++)
	{
		scanf("%lld%lld",&x,&y);
		if(x<y) swap(x,y);
		G[x].push_back(y);
		sz[x]++;
	}
	for(int i=1;i<=n;++i)  sz[i]=powmod(sz[i],mod-2);


	for(i=1;i<=n;i++) {
		for(j=1;j<=n;j++) v[j]=0;
		v[i]=1;
		DP();
		for(j=1;j<=n;j++)f[i][j]=dp[j];
	}
	



	for(i=1;i<=n;i++)v[i]=v0[i];
	DP();



	while(k--)
	{
		scanf("%lld%lld",&type,&x);
		if(type==1)
		{
			scanf("%lld",&y);
			tot++;
			lis[tot]=x;
			add[tot]=y;
		}
		else
		{
			ll ans=dp[x];
			for(i=1;i<=tot;i++)ans+=add[i]*f[lis[i]][x]%mod;
			printf("%lld\n",ans%mod);
		}
		if(tot>S)
		{
			for(i=1;i<=tot;i++)(v[lis[i]]+=add[i])%=mod;
				DP();
				tot=0;
		}
	}
	return 0;
}
发布了498 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/104598580