fork download
  1. #include<bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. using namespace std;
  5. int const N=50001, mod=1e9+7;
  6. bool odw[N];
  7. long long il[N], zm;
  8. pair<long long,long long>dp[N];
  9. vector<int>g[N],pref[N],suf[N];
  10.  
  11. void dfs(int v,int o){
  12. odw[v]=1;
  13. for(int i:g[v]){
  14. if(odw[i]==0) {
  15. dfs(i,v);
  16. pref[v].push_back(dp[i].F+dp[i].S);
  17. suf[v].push_back(dp[i].F+dp[i].S);
  18. }
  19. }
  20. /*cout<<v<<' ';
  21.   for(auto i:pref[v]) cout<<i<<' ';
  22.   cout<<endl;*/
  23. if(v!=1&&g[v].size()==1) suf[v].push_back(1);
  24. for(int i=1;i<pref[v].size();i++) pref[v][i]=pref[v][i]*pref[v][i-1]%mod;
  25. for(int i=suf[v].size()-2;i>=0;i--) suf[v][i]=suf[v][i+1]*suf[v][i]%mod;
  26. for(int i=0;i<g[v].size();i++){
  27. if(g[v][i]!=o){
  28. if(i!=0&&i!=g[v].size()-1) dp[v].F=(dp[v].F+dp[i].S*pref[v][i-1]*suf[v][i+1])%mod;
  29. else if(i==0&&i!=g[v].size()-1) {dp[v].F=(dp[v].F+dp[i].S*suf[v][i+1])%mod; cout<<v<<' ';}
  30. else if(i==g[v].size()-1&&i!=0) dp[v].F=(dp[v].F+dp[i].S*pref[v][i-1])%mod;
  31. else {dp[v].F=dp[v].F+dp[i].S; cout<<v<<endl;}
  32. }
  33. }
  34. dp[v].S=suf[v][0];
  35. }
  36.  
  37. int main(){
  38. ios_base::sync_with_stdio(0);
  39. cin.tie(0);
  40. int n,m,a,b;
  41. cin>>n>>m;
  42. for(int i=1;i<=n;i++) il[i]=1;
  43. for(int i=0;i<m;i++){
  44. cin>>a>>b; g[a].push_back(b); g[b].push_back(a);
  45. }
  46.  
  47. dfs(1,0);
  48. cout<<endl;
  49. for(int i=1;i<=n;i++) cout<<dp[i].F<<' '<<dp[i].S<<endl;
  50. //cout<<(dp[1].F+dp[1].S)%mod;
  51. }
  52.  
Success #stdin #stdout 0.01s 7512KB
stdin
7 6
1 2
1 3
1 4
3 5
3 6
6 7
stdout
1 
2 2
0 1
1 1
0 1
0 1
0 1
0 1