这次考崩了,本来以为可以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 }