• 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 }
  • 相关阅读:
    json
    mybatis 一对一关联对象查询
    下拉框多级联动
    时间轴和操作元素属性
    上传
    多选框获取和全选
    字符串操作,截取最后一个逗号
    idea快捷键使用
    获取下拉框的文本和值,下拉框默认选中
    toString()函数分析
  • 原文地址:https://www.cnblogs.com/baocong/p/6401304.html
Copyright © 2020-2023  润新知