题目大意

求从l到r的整数中长度为n的等比数列个数,公比可以为分数

首先n=1的时候,直接输出r-l+1即可

n=2的时候,就是C(n, 2)*2

考虑n>2的情况

不妨设公比为p/q(p和q互素->既约分数)

那么等比数列为

k      k*p/q     k*(p/q)^2  .....          k*(p/q)^(n-1)

因为都是整数,所以k一定可以表示为x*q^(n-1),化简数列得

x*q^(n-1)  ........     x*p^(n-1)

也就是说,假如q < p, 那么最小值就是x*q^(n-1), 最大值就是x*p^(n-1)

接下来我们又发现当n>2的时候

p和q都必须小于等于sqrt(r) (因为p^2,q^2都小于等于r)

所以就直接从1到sqrt(r)枚举p和q即可,利用辗转相除判断互素,求出所有可行的x,这样复杂度就是rlog(r)

注意当n>30的时候,显然不存在任何等比数列,所以输出0即可(这样可以不用写快速幂,因为n很小)

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. typedef long long ll;
  5. ll power(ll x, ll n)
  6. {
  7. ll ans = ;
  8. for(int i = ; i <= n; i++) ans *= x;
  9. return ans;
  10. }
  11. ll gcd(ll x, ll y) { return (x%y == ) ? y : gcd(y, x%y); }
  12. ll n, l, r;
  13. int main()
  14. {
  15. cin>>n>>l>>r;
  16. if(n == ) cout<<r-l+;
  17. else if(n == )
  18. {
  19. cout<<(r-l+)*(r-l);
  20. }
  21. else if(n > )
  22. {
  23. cout<<;
  24. }
  25. else
  26. {
  27. ll ans = ;
  28. for(int i = ; i < r; i++)
  29. {
  30. int p = i, R = r/power(p, n-);
  31. if(R == ) break;
  32. for(int j = ; j < p; j++)
  33. {
  34. int q = j;
  35. int L = (l-)/power(q, n-)+;
  36. if(L > R) continue;
  37. if(gcd(p, q) == ) { ans += (R-L+); }
  38. }
  39. }
  40. cout<<ans*<<endl;
  41. }
  42. }

Codeforces Round #392(Div 2) 758F(数论)的更多相关文章

  1. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

  2. Codeforces Round #538 (Div. 2) C 数论 + 求b进制后缀零

    https://codeforces.com/contest/1114/problem/C 题意 给你一个数n(<=1e8),要你求出n!在b进制下的后缀零个数(b<=1e12) 题解 a ...

  3. Codeforces Round #392 (Div. 2) F. Geometrical Progression

    原题地址:http://codeforces.com/contest/758/problem/F F. Geometrical Progression time limit per test 4 se ...

  4. Virtual Codeforces Round #392 (Div. 2)

    下午闲来无事开了一场Virtual participation 2h就过了3道水题...又跪了..这只是Div. 2啊!!! 感觉这次直接就是跪在了读题上,T1,T2读题太慢,T3还把题读错了 要是让 ...

  5. Codeforces Round #554 (Div. 2) C 数论

    https://codeforces.com/contest/1152/problem/C 题意 a和b,找到k,使得lcm(a+k,b+k)最小(a,b:1e9) 题解 设gcd=gcd(a+k,b ...

  6. Codeforces Round #392 (Div. 2) - C

    题目链接:http://codeforces.com/contest/758/problem/C 题意:给定N*M矩阵的教室,每个位置都有一个学生,Sergei坐在[X,Y],然后老师会问K个问题,对 ...

  7. Codeforces Round #392 (Div. 2) - B

    题目链接:http://codeforces.com/contest/758/problem/B 题意:给定n个点灯的情况,灯只有四种颜色RBGY,然后如果某个灯坏了则用'!'表示,现在要求将坏的灯( ...

  8. Codeforces Round #392 (Div. 2) - A

    题目链接:http://codeforces.com/contest/758/problem/A 题意:给定N个城市的福利,国王现在想让每个城市的福利都一致.问最少需要花多少钱使得N个城市的福利值都一 ...

  9. Codeforces Round #392 (Div. 2)-758D. Ability To Convert(贪心,细节题)

    D. Ability To Convert time limit per test 1 second Cmemory limit per test 256 megabytes input standa ...

随机推荐

  1. 操作BOM

    BOM的作用是将相关的元素组织包装起来,提供给程序设计人员使用,从而降低开发人员的劳动量,提高设计Web页面的能力. 整个window对象是整个BOM的核心. 通过BOM可实现的功能: 弹出新的浏览器 ...

  2. js分割字符串

    js分割字符串 我想达到通过 : 分割 只要第一次分割,后面的内容不使用分割 不行,没找到可以直接用的方法,不过可以通过其它方式达到效果 eg: str.split(':',2)[0] (第一个分隔符 ...

  3. pyecharts的简单使用

    由于需要在项目中展示数据,查了查资料发现,pyecharts模块在网页数据展示方面有很大优势,所以就学了点pyechas 参考博客:Python:数据可视化pyecharts的使用 - JYRoy - ...

  4. C语言实现计算二进制数字1的个数

    #include<stdio.h> #include<stdlib.h> int print_one_bits01(unsigned int value){ //0000 11 ...

  5. Kubernetes-GC

    Kubernetes集群中垃圾回收(Garbage Collection)机制由kubelet完成.kubelet定期清理不再使用的容器和镜像,每分钟进行一次容器的GC操作,每五分钟进行一次镜像的GC ...

  6. 利用nodejs实现商品管理系统(二)

    下面实现商品管理系统 第一步:对应的ejs与数据交换的编写格式. 商品列表界面product.ejs <% for(var i=0;i<list.length;i++){%> < ...

  7. Javaweb——四则运算---18.11.01

    ---恢复内容开始--- test.jsp <%@ page language="java" contentType="text/html; charset=utf ...

  8. Python入门及容易!网摘分享给大家!

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  9. python2.7练习小例子(五)

        5):题目:输入三个整数x,y,z,请把这三个数由小到大输出.     程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比 ...

  10. 汇编实验15:安装新的int 9中断例程

    汇编实验15:安装新的int 9中断例程 任务 安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,一旦松开后,就显示满屏幕的“A”,其他键照常处理. 预备知识概要 这次实 ...