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

来源:互联网 发布:金科天启大数据 编辑:程序博客网 时间:2024/06/08 16:32

题目大意:

       找出所有长度为n,每一项都在l到r之间的等比数列的个数(q!=1)

解题思路:

      其实除了几种特殊情况外,基本都是枚举分子分母互质的分数,考虑到只有两项的时候数量较大,所以单独判断

代码:

#include "iostream"#include "cstdio"#include "math.h"#include "algorithm"#include "string"#include "string.h"#include "vector"#include "map"#include "queue"using namespace std;long long n, l, r;long long pow(long long a, long long x) {long long ans = 1;while (x) {if (x & 1)ans *= a;a *= a;x /= 2;}return ans;}long long gcd(long long a, long long b){return (b>0) ? gcd(b, a%b) : a;}int main() {while (scanf("%lld %lld %lld", &n, &l, &r) != EOF) {if (n == 1) {printf("%lld\n", r - l + 1);}else if (n == 2) {printf("%lld\n", (r - l + 1)*(r - l));}else if (n > 25) {puts("0");}else {long long ans = 0;long long maxnum = pow(2, log(100000000*0.1)/log(2.0) / (n - 1));maxnum = min(maxnum, 3200LL);for (long long i = 1;i <= maxnum;i++) {for (long long j = i + 1;j <= maxnum;j++) {if (gcd(i, j) == 1) {long long a = pow(j, n - 1);long long b = pow(i, n - 1);if (l*a / b > r)continue;ans += (r*b / a) / b - (l - 1) / b;}}}printf("%lld\n", ans * 2);}}return 0;}

0 0
原创粉丝点击