首页 > 其他分享 >【题解】AtCoder-ABC306G Return to 1

【题解】AtCoder-ABC306G Return to 1

时间:2023-06-23 20:22:17浏览次数:33  
标签:Return ABC306G dep 题解 int pmod maxn equiv

这也太强了!

容易想到的是用若干环拼出这个 \(10^{10^{100}}\),也就是这些环的 \(\gcd \mid 10\)。

之后就不会了。

先正图反图两次 DFS,只留下 \(1\) 所在强连通分量里的边,对正图跑 DFS 生成树,定义其深度从 \(0\) 开始,然后有一个结论是:对于任何正整数 \(a\),图中存在一个包含 \(1\) 的且长度不是 \(a\) 的倍数的环的充要条件是存在一条图上的边 \((u,v)\) 使 \(dep_{u}+1-dep_v\not\equiv\pmod a\)。

下面是证明。

必要性考虑证明逆否命题,即若不存在一条图上的边 \((u,v)\) 使 \(dep_{u}+1-dep_v\not\equiv\pmod a\),则图中包含 \(1\) 的环的长度都是 \(a\) 的倍数。这是显然的,由于这样的环深度从 \(0\) 开始,每次移动都相当于深度在模 \(a\) 意义下加 \(1\),又回到 \(0\),所以环长一定是 \(a\) 的倍数。

充分性不知道题解在说什么,但是若存在这样 \(dep_{u}+1-dep_v\not\equiv\pmod a\) 的边,就说明 \((u,v)\) 是非树边且 \(u\) 和 \(v\) 是由两条不同的根链遍历到的,由于 \(dep_{u}+1-dep_v\not\equiv\pmod a\),那么 \(1\to u\) 的根链长加 \(1\) 与 \(1\to v\) 的根链长,在模 \(a\) 意义下不同余,也就是两条 \(1\) 到 \(v\) 的路径长不同余。这时候同样是从 \(v\) 回到 \(1\),两个环长度一定不同余,那么至少有一个不是 \(a\) 的倍数。

这样我们对所有环求 \(\gcd\) 就可以对所有 \(dep_u+1-dep_v\) 求 \(\gcd\)。

点击查看代码
int t;
int n,m;
vector<int> E1[maxn],E2[maxn];
bool vis1[maxn],vis2[maxn];
int dep[maxn];
void dfs1(int u,int d){
    vis1[u]=true,dep[u]=d;
    for(int v:E1[u]){
        if(vis1[v]) continue;
        dfs1(v,d+1);
    }
}
void dfs2(int u){
    vis2[u]=true;
    for(int v:E2[u]){
        if(vis2[v]) continue;
        dfs2(v);
    }
}
int main(){
    t=read();
    while(t--){
        n=read(),m=read();
        for(int i=1;i<=n;++i){
            E1[i].clear(),E2[i].clear();
            vis1[i]=false,vis2[i]=false,dep[i]=0;
        }
        for(int i=1;i<=m;++i){
            int u=read(),v=read();
            E1[u].push_back(v);
            E2[v].push_back(u);
        }
        dfs1(1,0);
        dfs2(1);
        int g=0;
        for(int u=1;u<=n;++u){
            if(!vis1[u]||!vis2[u]) continue;
            for(int v:E1[u]){
                if(!vis1[v]||!vis2[v]) continue;
                if(!g) g=abs(dep[u]+1-dep[v]);
                else g=__gcd(g,abs(dep[u]+1-dep[v]));
            }
        }
        if(!g) printf("No\n");
        else{
            while(g%2==0) g/=2;
            while(g%5==0) g/=5;
            if(g==1) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

标签:Return,ABC306G,dep,题解,int,pmod,maxn,equiv
From: https://www.cnblogs.com/SoyTony/p/Solution_on_AtCoder_ABC306G.html

相关文章

  • 2023年最新5000道校招常用编程面试题分享(附详细题解)
    截止到2021年最新,本资源整理了近5000道校招常用面试题,并附带详细的解题思路及代码,包含leetcode,校招笔试题,面试题,算法题,语法题。持续更新中。。。目录内容截图......
  • P8477 「GLR-R3」春分 题解
    更好的阅读体验牛逼逼题。Subtask1直接暴力,每个实验配一块板。需要\(n^2\)块板。cout<<n*n<<'\n';for(inti=1;i<=n;++i){for(intj=1;j<=n;++j){cout<<"1"<<i<<''<<++c<......
  • WGCLOUD在windows启动server - dos窗口显示乱码的问题解决
    首先,这个乱码没有影响,忽略即可这个是windows窗口编码导致的,不会影响程序运行,server/log下日志文件没有出现乱码,我们主要看日志文件如果我们想处理,也可以的,修改server/start.bat,添加一行命令,chcp65001,如下echo%cd%start/d"%cd%"wgcloud-daemon-release.exechcp65001java-......
  • AT_abc118_d题解
    ATLuogu题目描述有\(n\)根火柴\(m\)种数字,数字\(1,2,3,4,5,6,7,8,9\)分别需要\(2,5,5,4,5,6,3,7,6\)根火柴,要求\(n\)根火柴全部都用完且拼成的数字最大,输出这个数字。输入格式第一行两个整数\(n\),\(m\);第二行\(m\)个整数,分别为\(a_1,a_2,...,a_m\)(即\(m\)种......
  • 在finally中出现return会发生什么?
    目录看点:面试题:看点:当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有finally块,系......
  • P2596 [ZJOI2006]书架 题解
    题目传送门:link。FHQ-Treap解题的关键在于如何来求出一本书上面有多少本书,但考虑到我们里面没有像权值一样的东西来让我们用按值分裂来完成这个操作,所以考虑用按排名分裂来实现。我们按照先后顺序把所有的书都给插入到平衡树里面,根据二叉搜索树的性质,当前结点的所有左子树的结......
  • Linux Nacos2.2.0版本集群搭建,常见报错问题解决
    准备:服务器,nacos,mysql,nginx,java,mavenNacos官网:https://nacos.io下载地址github:https://github.com/alibaba/nacos相关版本问题,见nacos官网手册查看集群配置图:官方的: 本次搭建集群配置图:开始搭建:修改nacos的配置文件“application.properties,cluster.conf.ex......
  • 金九银十首战告捷,五年Android开发工程师面试经验分享(附面试题解析)
    笔者从前期准备到所有面试结束,花费了差不多3个月的时间。真可谓“面试造火箭,工作拧螺丝”,面试过程真的很累很辛苦。笔者面了很多公司,最终拿下了百度、腾讯和京东的offer,最后可能会选择京东。有人可能会问为什么不选择腾讯?的确腾讯的工资很高,福利待遇也很好。我觉得在京东能接触到更......
  • CF248B Chilly Willy 题解
    CF248BChillyWilly解题过程经过简单思考,这道题肯定是由规律可循,因为\(n\le10^5\),只有高精度能存下。下面是暴力程序对\(n\)为\(1\)到\(13\)时的答案进行求解(\(11\)到\(13\)超出int范围了)。发现\(n\)为\(1\)或\(2\)时,他们的答案为\(-1\)。接着来分析......
  • UVA12222 Mountain Road 山路 题解 dp
    UVA12222山路题意:--一个山路只有一条车道,因此不能有两辆方向相反的车同时在车道内。同时,为了保证安全,车道内不能超车,且同向行驶的车间距必须大于10分钟。现在给你n辆车,三个参数依次表示行驶方向,到达时刻,行驶时间。问如何安排能使最后一个通过的车通过时的时刻最小,输出这个值......