Cyclic GCDs
Cyclic GCDs
题面描述
有\(n\)个点,每个点有权值。
现有排列\(P\),\(p_i\)表示\(i\)个点向\(p_i\)连了一条边。
显然会形成若干个简单环。每个简单环的权值定义为环上最小的权值,一张图的权值定义为所有环的权值的乘积。
所有形成了\(k\)个简单环的图的权值和记为\(b_k\)
现在要求\(b_1,b_2...b_n\)的最大公因数。
输出对大质数取模。
\(n\le10^5\)
解题思路
首先可以发现,顺序无关紧要,为了方便处理,我们把权值从小到大排序。
考虑这样的一个\(DP\)
我们设\(dp[i][j]\)表示考虑到前\(i\)个数,共形成了\(j\)个简单环的权值和。
我们考虑把第\(i+1\)个数塞进去的方式:
- 塞入到一个之前的环中,可以接在每个点后面,共有\(i\)种接法。由于我们从小到大排序,所以不会改变每个环上的最小值,得到转移:\(dp[i+1][j]+=i*dp[i][j]\)
- 独立成环,方案数不变,多了一个\(a_{i+1}\)的权值,得到转移:\(dp[i+1][j+1]+=a_{i+1}*dp[i][j]\)
于是我们得到了一个\(O(n^2)\)的做法。
我们把\(dp[k]\)的生成函数写出来,设为
\]
根据上面的转移,可知:
\]
于是,最终的\(dp[n]\)的生成函数为:
\]
可以证明,最后的\(gcd\)等于每个\(gcd\)相乘。
于是我们就愉快的做完了。
证明
命题:\(S(x),R(x)\)为整系数多项式,每一项系数的\(gcd\)分别为\(s,r\),则多项式\(P(x)Q(x)\)每一项系数的\(gcd\)为\(sr\)
证明:不妨设\(s=r=1\),不难证明,这与原命题等价。
假设\(S(x)R(x)\)每一项系数的\(gcd\)为质数\(p\)的倍数,我们期望导出矛盾。
考虑最高次项的系数,为\(S(x)\)与\(R(x)\)的最高项系数相乘得到的结果。
因为最高次项系数为质数\(p\)的倍数,所以\(S(x),R(x)\)的最高项系数其中一个为\(p\)的倍数,不妨设为\(S(x)\)的最 高项系数。
因为系数为\(p\)的倍数,它与其他系数乘积也为\(p\)的倍数,并不影响最后多项式任何一项系数对\(p\)的整除性,所 以将\(S(x)\)的最高项次数变为\(0\),并不影响最后的\(gcd\)是否是\(p\)的倍数。
然后就变成了一个子问题,继续迭代,取最高次项,直到有一个多项式变为零多项式为止。
那么,这个零多项式,他原来的每一项系数均为\(p\)的倍数,这与假设不符,矛盾。
故原命题成立。
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n;
int ans;
int a[100005];
int gcd(int a,int b){
return a%b?gcd(b,a%b):b;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
ans=a[1];
for(int i=1;i<n;i++)
ans=1ll*ans*gcd(a[i+1],i)%mod;
printf("%d\n",ans);
}
Cyclic GCDs的更多相关文章
- 【AtCoder】Dwango Programming Contest V题解
A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...
- Codeforces Round #385 (Div. 2) A. Hongcow Learns the Cyclic Shift 水题
A. Hongcow Learns the Cyclic Shift 题目连接: http://codeforces.com/contest/745/problem/A Description Hon ...
- codeforces 709C C. Letters Cyclic Shift(贪心)
题目链接: C. Letters Cyclic Shift 题意: 现在一串小写的英文字符,每个字符可以变成它前边的字符即b-a,c-a,a-z这样,选一个字串变换,使得得到的字符串字典序最小; 思路 ...
- Cyclic Nacklace[HDU3746]
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3746:Cyclic Nacklace
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- V-rep学习笔记:机器人逆运动学数值解法(Cyclic Coordinate Descent Method)
When performing inverse kinematics (IK) on a complicated bone chain, it can become too complex for a ...
- hdu-----(3746)Cyclic Nacklace(kmp)
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 1853 Cyclic Tour 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...
- Cyclic Nacklace
Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...
随机推荐
- Linux命令速查手册(第2版)学习
第1章.需要了解的命令行相关事项 表1-1 如何在文件名字符中使用特殊字符 字符 建议 / 绝不使用.不能转义 \ 必须转义.避免使用 _ 绝不能作为文件或目录名的第一个字符 [] 必须转义.避免使用 ...
- thinkphp ASSIGN标签
ASSIGN标签用于在模板文件中赋值变量,用法如下: 直线电机厂家 <assign name="var" value="123" /> 在运行模板的 ...
- csps模拟8990部分题解
题面: 666: 重点在题意转化:每个数可以乘k,代价为k,可以减一,代价为1, 所以跑最短路即可 #include<iostream> #include<cstdio> #i ...
- win10 mysql5.7忘记密码如何解决
点击开始菜单,搜索cmd.exe,左击以管理员身份运行 操作之前先备份好数据库(切忌) C:\Users\Administrator>cd C:\Program Files\MySQL\MySQ ...
- jQuery WeUI
jQuery WeUI jQuery WeUI 是专为微信公众账号开发而设计的一个简洁而强大的UI库,包含全部WeUI官方的CSS组件,并且额外提供了大量的拓展组件,丰富的组件库可以极大减少前端开发时 ...
- Cocos2d-x通过Jni实现C++与Java相互调用
在cocos2dx项目中与运营平台(java sdk)对接时使用了JNI. 通过C++调用Java 在JniUtil.h文件中如下实现: #ifndef _JNIUTIL_H_ #define _JN ...
- 由Toolbar造成的ListView最后一项显示不全
懒得写了==附上参考博文 Android GirdView/Listview 最后一行显示不完整 - sex_34的专栏 - CSDN博客
- 用星星画菱形--Java
用星星画菱形 public class Hello{ public static void main(String[] args) { char star = '\u2605'; System.out ...
- more 和less 命令简单介绍以及使用
一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...
- 【树剖】CF916E Jamie and Tree
好吧这其实应该不是树剖... 因为只要求子树就够了,dfs就好了 大概就是记录一个全局根root 多画几幅图会发现修改时x,y以root为根时的lca为以1为根时的lca(x,y),lca(root, ...