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]\)的生成函数写出来,设为

\[F_k(x)=\sum_{i=0}^n dp[k][i]*x^i
\]

根据上面的转移,可知:

\[F_{k+1}(x)=F_k(x)*(a_{k+1}x+k)
\]

于是,最终的\(dp[n]\)的生成函数为:

\[F_n(x)=\prod_{i=0}^{n-1}(a_{i+1}x+i)
\]

可以证明,最后的\(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的更多相关文章

  1. 【AtCoder】Dwango Programming Contest V题解

    A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...

  2. 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 ...

  3. codeforces 709C C. Letters Cyclic Shift(贪心)

    题目链接: C. Letters Cyclic Shift 题意: 现在一串小写的英文字符,每个字符可以变成它前边的字符即b-a,c-a,a-z这样,选一个字串变换,使得得到的字符串字典序最小; 思路 ...

  4. Cyclic Nacklace[HDU3746]

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 3746:Cyclic Nacklace

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. V-rep学习笔记:机器人逆运动学数值解法(Cyclic Coordinate Descent Method)

    When performing inverse kinematics (IK) on a complicated bone chain, it can become too complex for a ...

  7. hdu-----(3746)Cyclic Nacklace(kmp)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  9. Cyclic Nacklace

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

随机推荐

  1. Monkey 稳定性测试

    学习网址: https://blog.csdn.net/lucytan01/article/details/79958727 https://blog.csdn.net/hebbely/article ...

  2. leetcode-17-电话号码的字母组合’

    题目描述: 方法一:回溯 class Solution: def letterCombinations(self, digits): """ :type digits: ...

  3. Java 基础 - 基本类型和引用类型

    ref: https://www.cnblogs.com/ysocean/p/8482979.html#_label2 ------------------ 这里再给大家普及一个概念,在 Java 中 ...

  4. BZOJ 2660 (BJOI 2012) 最多的方案

    Description 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一 ...

  5. C#winform datagridview单元格的单击处理

    首先看看效果图: 需求:要求是的在datagridview里面绑定数据后,可以任意点击想要点击的某列的单元格进行改变数据.需要在datagridview里面写3个事件 1.RowPrePaint事件: ...

  6. day 73 Django基础八之cookie和session

      Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...

  7. HTML5 新模块元素兼容问题

    新增块元素默认样式 下列HTML5新模块元素在IE8.9版本浏览器中没有被定义默认样式.为解决该问题,给下列元素添加“block”显示属性. 代码: article, aside, details, ...

  8. 第三周课堂笔记4thand5th

    循环打印 #计算字典中的键值对的个数 print(len(a)) #获取字典中键的列表 print(a.keys()) #获取字典中值的列表 print(a.values()) #获取字典中键值对的个 ...

  9. 2019 Multi-University Training Contest 6 Snowy Smile (最大字段和变形)

    题意: 求一个子矩阵要求其矩阵内的合最大. 题解: 正常的求最大子矩阵的复杂度是O(n^3) 对于这一题说复杂度过不去,注意到这个题总共只有2000个点关键点在与这里优化 最大子矩阵可以压缩矩阵变成最 ...

  10. selenium基础(元素定位)

    selenium的帮助文档: https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions 目前支 ...