子曰:“君子成人之美,
不成人之恶;小人反是。”
君子成全别人的好事,而不坏别人的事,小人则是相反的。
不过今天的第一题就是阻止向前跑的。
本文讲述如何在概率问题中,运用代数变形,求解出具有递归性的问题。
我们的问题从一个大问题转换成了小问题。
对于每个概率,我们是容易计算出的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1000010,M=3*N;
const int mod=998244353;
int h[N],e[M],ne[M];
int idx;
int f[N],sum[N],deg[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
signed main()
{
int id,n,m;
cin>>id>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
++deg[x];
}
for(int x=1;x<=n;x++)
{
f[x]=deg[x]+1;
for(int i=h[x];~i;i=ne[i])
{
int y=e[i];
f[x]=((f[x]+(sum[x-1]-sum[y-1])%mod)%mod+mod);
}
sum[x]=(sum[x-1]+f[x])%mod;
}
cout<<sum[n];
}
https://ac.nowcoder.com/acm/contest/73760/F
这道题使用的代数变形手段,
在微积分中,我们也类似的问题。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int mod=1e9+7;
int f[60][60][60][60];
int vis[60][60][60][60];
int quick(int a,int b)
{
int t=1;
while(b)
{
if(b&1)t=t*a%mod;
a=a*a %mod;
b=b/2;
}
return t;
}
int dfs(int a,int b,int c,int d)
{
if(vis[a][b][c][d])
{
return f[a][b][c][d];
}
vis[a][b][c][d]=1;
if(a+c==0||a+b==0||c+d==0||b+d==0)
{
return 0;
}
int sum=0;
int de1=quick(a+b,mod-2),de2=quick(c+d,mod-2);
if(a&&d)sum+=dfs(a-1,b,c,d)*a%mod*de1%mod*de2%mod*d%mod;
if(b&&c)sum+=dfs(a,b,c-1,d)*b%mod*de1%mod*de2%mod*c%mod;
sum=(sum+1)%mod;
int De=1-a*c%mod*de1%mod*de2%mod-b*d%mod*de1%mod*de2%mod;
De=(De+2*mod)%mod;
return f[a][b][c][d]=sum*quick(De,mod-2)%mod;
}
int a,b,c,d;
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
if(t==1)a++;
else b++;
}
for(int i=1;i<=m;i++)
{
int t;
cin>>t;
if(t==1)
c++;
else d++;
}
cout<<dfs(a,b,c,d);
}