E. You 题解(思维)
题目链接
题目思路
懒得口胡了,官方题解写的很好,仔细看下应该就懂了
题目还是很妙的
代码
#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
不摆烂了,写题