• 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 }
  • 相关阅读:
    Bootstrap 4/3 页面基础模板 与 兼容旧版本浏览器
    Asp.net core 项目实战 新闻网站+后台 源码、设计原理 、视频教程
    C# 数据类型转换 显式转型、隐式转型、强制转型
    C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别
    C#/Entity Frame Core 使用Linq 进行分页 .Skip() .Take() 的使用方法
    利用 Xunsearch 搭建搜索引擎、内容搜索实战
    Delphi
    Python
    Python
    Python
  • 原文地址:https://www.cnblogs.com/baocong/p/6401304.html
Copyright © 2020-2023  润新知