Codeforces Round #392 (Div. 2) F. Geometrical Progression 找规律 快速幂

F. Geometrical Progression

链接:

http://codeforces.com/contest/758/problem/F

题意:

给定 nl and r ,求项数为n, 公比不为1,且数列每一项都属于[l,r]范围的不同的 等比数列 的个数。

题解:

其实是先缩小范围然后直接枚举。

考虑数据范围1?≤?n?≤?107,?1?≤?l?≤?r?≤?10

设等比数列公比为d, d表示为 q/p,其中q或p为不同时等于1,且互质的正整数。

递增和递减数列的情况是成对出现的,即p和q互换。

所以不妨只考虑递增数列的情况,即公比d表示为q/p,其中pq互质,p为任意正整数,q>p,q为大于等于2的正整数。

则数列末项整除于qn-1 其中q>=2,2^24>10^7, 故n>=24时无解。

n=1时为结果为r-l+1, n=2时结果为(r-l+1)*(r-l),n>24时0.

n>=3&&n<24时,可以通过枚举出p和q的情况求解。

n>=3, 由于数列末项整除于qn-1 ,则qn-1 ≤?107,即枚举 p,q的上界是(1071/(n-1),当n=3时,这个值为3162,可以通过暴力枚举实现。

枚举p,q,

每找到一对(p,q)且gcd(p,q)==1

考虑数列末项  an= a1*qn-1/pn-1  ,

要满足 a1>=l, an<=r 的范围条件,若 l*qn-1/pn-1 >r 则不满足题意,continue;

 l*qn-1/pn-1 <=r 则有满足[l,r]范围的等比数列

现在求[l,r]范围,公比为q/p,项数为n的等比数列的个数。

数列各项为 a1, a1*q/p ……a1*qn-1/qn-1qn-1pn-1  /n-1/n-1pn-1q/pq/pq/p ,等比数列的个数即为a1可能的值。n-1

末项为moa1*qn-1/ pn-1  所以a1必整除于pn-1 ,即a1可能的值为 [l,r*pn-1/qn-1]范围内可被 pn-1整除的, 即 (r*pn-1/qn-1)/pn-1-l/pn-1

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 
 8 LL gcd(LL a, LL b) {
 9     return b == 0 ? a : gcd(b, a%b);
10 }
11 
12 LL pow(LL a, LL i) {
13     if (i == 0) return 1;
14     LL temp = pow(a, i >> 1);
15     temp *= temp;
16     if (i & 1) temp *= a;
17     return temp;
18 }
19 
20 int main(){
21     LL l, r, n;
22     cin >> n >> l >> r;
23     if (n > 24) return 0 * printf("0
");
24     if (n == 1) return 0 * printf("%lld
", r - l + 1);
25     if (n == 2) return 0 * printf("%lld
", (r - l + 1)*(r - l));
26     LL upperlimit, pn, qn, ans = 0;
27     upperlimit = pow(2, double(log2(1e7 + 50) / (n - 1))); 
28     for (LL p = 1; p <= upperlimit; p++)
29         for (LL q = p + 1; q <= upperlimit; q++)
30             if (gcd(p, q) == 1){
31                 qn = pow(q, n - 1);
32                 pn = pow(p, n - 1);
33                 if (l*qn / pn>r) continue;
34                 ans += (r*pn / qn) / pn - (l - 1) / pn;
35             }
36     cout << ans * 2 << endl;
37     return 0;
38 }
原文地址:https://www.cnblogs.com/baocong/p/6401304.html