E. You 题解(思维)

时间:2021-07-30
本文章向大家介绍 E. You 题解(思维),主要包括 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

卷也卷不过,躺又躺不平

原文地址:https://www.cnblogs.com/hunxuewangzi/p/15079367.html