题目链接
#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;
}