E. You 題解(思維)
阿新 • • 發佈:2021-07-30
題目連結
題目思路
懶得口胡了,官方題解寫的很好,仔細看下應該就懂了
題目還是很妙的
程式碼
卷也卷不過,躺又躺不平#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define fi first #define se second #define debug printf("aaaaaaaaaaa\n"); const int maxn=2e5+5,inf=0x3f3f3f3f,mod=998244353; const ll INF=0x3f3f3f3f3f3f3f3f; const double eps=1e-7; int n,ok; int head[maxn],cnt=0; int dp[maxn]; struct edge{ int to,next; }e[maxn<<2]; void add(int u,int v){ e[++cnt]={v,head[u]}; head[u]=cnt; } ll ans[maxn]; void dfs(int u,int fa,int k){ if(!ok) return ; for(int i=head[u];i;i=e[i].next){ if(e[i].to^fa){ dfs(e[i].to,u,k); } } if(u!=1){ // 判斷u和fa邊給u還是給fa if(dp[u]%k==0){ dp[fa]++; }else{ dp[u]++; if(dp[u]%k!=0){ ok=0; } } } } int main(){ int _;cin>>_; while(_--){ cin>>n; cnt=0; for(int i=1;i<=n;i++){ ans[i]=head[i]=0; } for(int i=1,u,v;i<=n-1;i++){ cin>>u>>v; add(u,v),add(v,u); } ans[1]=1; for(int i=1;i<=n-1;i++){ ans[1]=2*ans[1]%mod; } for(int i=2;i<=n-1;i++){ if((n-1)%i==0){ ok=1; for(int j=1;j<=n;j++){ dp[j]=0; } dfs(1,1,i); ans[i]=ok; } } for(int i=n-1;i>=1;i--){ for(int j=i+i;j<=n-1;j+=i){ ans[i]=((ans[i]-ans[j])%mod+mod)%mod; } } for(int i=1;i<=n;i++){ cout<<ans[i]<<" "; } cout<<'\n'; } return 0; } ////aaa