#211. 数列

来源:互联网 发布:淘宝店铺首页全屏轮播 编辑:程序博客网 时间:2024/06/13 04:41

首先假设m是质数,则由于每个数都有自己的逆元,每种前缀积都可以两两互相转化(b=a*(inv[a]*b%m)%m)。

然后考虑m不为质数的情况,发现数列中相邻的两个前缀积a,b满足gcd(a.m)|gcd(b,m)。因此我们把gcd(a,m)==gcd(b,m)的数都堆成一坨,当m为质数处理,gcd(a,m)<gcd(b,m)的情况只要在原来的基础上乘以gcd(b,m)/gcd(a,m)就行了。

接下来要让数列最长,我们把每坨数都看成一个权值为数的个数的点,建一个DAG跑一跑,就直接A掉了。

0 0