这次考崩了,本来以为可以T1骗点分,看了题面后想了二分,心想40分稳了,然后就干后面的题,最后爆了十分

long long没加,二分时相乘数太大,本以为能骗分。。。。。

这题首先就不讲了,

正解其实不难首先要质因数分解,

 因为选出的一段是一个等比序列的子序列,我们分为两种情况:
1. q=1,相当于找一个最长每个数都相等的子串,这个扫一遍就行了。
2. q!=1,那么这个序列最长只有 logn,那么我们可以枚举开头,不妨设开始的两个数为 a[i]和 a[i+1],
其中比较大的一个为 x,另一个 y。
(1) 首先要满足 x%y=0
(2) 让 z=x/y,然后把 z 质因数分解,z=p1^q1*p2^q2*p3^q3......,设 g=gcd(q1,q2,q3...),那么当前序
列的最小公比就是 p1^(q1/g)*p2^(q2/h)*......
(3) 我们找到最小公比后,每当往后加一个数,判断它与前边的数的比是否是最小公比的整次幂,
不是的话就说明不能再加了。
(4) 还有一个要求就是这个序列里不能有重复的数,这个东西用 set 判断就行了。

然后用辗转相除法处理出kx_1,kx_2的比是否为base的整数幂

一开始把辗转相除忘了。。。

质因数分解板子:(将每个数的因子及幂放起来,注意处理质数)

 1 void work_zhi(ll x)
 2 {
 3     ll kx=x;
 4     for(ll kkk=2;kkk<=min1(sqrt(kx),1000);++kkk)
 5     {
 6        if((kx%kkk)==0)
 7        {
 8           th.ps(kkk);
 9           ll sum=0;
10           while((kx%kkk)==0)
11           {
12                 sum++;
13                 kx/=kkk;
14           }
15           c.ps(sum);
16        }
17    }
18    if(kx>1){
19       th.ps(kx);c.ps(1);
20    }
21    return ;
22 }
View Code

相关文章: