这份代码用 C++ 14 交上去会 RE #1
但是 C++ 20 交上去就 AC 了
C++ 14 本地和 luogu 的机子都能过,但是用 CF 的 Custom Test 交会 RE
经过 Debug 可以发现问题出在了注释的两行位置
蒟蒻感觉那两行写的也没问题啊,求教大佬。
#include "iostream"
#include "vector"
using namespace std;
#define int long long
const int maxn = 200010;
const int mo = 1e9+7;
int n,sub[maxn],f[maxn];
vector<int>l[maxn],pre[maxn],suf[maxn];
void dfs(int p,int Fa){
sub[p]=1;
for(int i=0;i<l[p].size();i++){
int to=l[p][i];
if(to==Fa)continue;
dfs(to,p);
sub[p]=(sub[p]*(sub[to]+1))%mo;
}
}
void dp(int p,int Fa){
for(int i=0;i<l[p].size();i++)
pre[p].push_back(sub[l[p][i]]+1),
suf[p].push_back(sub[l[p][i]]+1);
for(int i=1;i<pre[p].size();i++)
pre[p][i]=(pre[p][i-1]*pre[p][i])%mo;
for(int i=suf[p].size()-2;i>=0;i--)//这里
suf[p][i]=(suf[p][i+1]*suf[p][i])%mo;//这里
for(int i=0;i<l[p].size();i++){
int to=l[p][i];
f[to]=f[p]+1;
if(i>0)f[to]=(f[to]*pre[p][i-1])%mo;
if(i<l[p].size()-1)f[to]=(f[to]*suf[p][i+1])%mo;
dp(to,p);
}
}
signed main(){
cin>>n;
for(int i=2,Fa;i<=n;i++){
cin>>Fa;
l[Fa].push_back(i);
}
dfs(1,0);
f[1]=0;
dp(1,0);
for(int i=1;i<=n;i++)
cout<<((f[i]+1)*sub[i])%mo<<' ';
}