codeforces 955C - Sad powers

传送门

Q(1?≤?Q?≤?105)组询问,给定L、R (1?≤?L?≤?R?≤?1018).,求闭区间内有多少个数能表示为一个数的k次幂(k > 1)

对于k=2的情况可以直接求根做差,对于k>3的情况,由于所有的数数目很少,我们可以直接枚举出来。过程中注意判重和平方数(否则与情况1重复计算)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <cmath>
 6 using namespace std;
 7
 8 typedef long long LL;
 9 const LL up = 1e18;
10
11 int Q;
12 LL L, R;
13
14 vector<LL> vec;
15
16 void init() {
17     vector<LL> tmp;
18     tmp.push_back(1);
19     LL _up = 1e6;
20     for (LL i = 2; i < _up; i++) {
21         for (LL j = i * i * i; ; j *= i) {
22             tmp.push_back(j);
23             if (j > up / i) break;
24         }
25     }
26     sort(tmp.begin(), tmp.end());
27     tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
28     for (int i = 0; i < tmp.size(); i++) {
29         LL t = tmp[i];
30         LL tt = sqrt(t);
31         if (tt * tt != t) vec.push_back(tmp[i]);
32     }
33 }
34
35 LL lower_root(LL A) {
36     LL t = sqrt(A);
37     if (t * t == A) t--;
38     return t;
39 }
40
41
42 int main() {
43     init();
44     scanf("%d", &Q);
45     while (Q--) {
46         scanf("%lld%lld", &L, &R);
47         LL ans = upper_bound(vec.begin(), vec.end(), R)
48                - lower_bound(vec.begin(), vec.end(), L);
49         ans += lower_root(R + 1) - lower_root(L);
50         printf("%lld\n", ans);
51     }
52
53     return 0;
54 }

原文地址:https://www.cnblogs.com/xFANx/p/9016153.html

时间: 2024-10-03 14:26:49

codeforces 955C - Sad powers的相关文章

Codeforces 955C Sad powers(数论)

Codeforces 955C Sad powers 题意 q组询问,每次询问给定L,R,求[L,R]区间内有多少个数可以写成ap的形式,其中a>0,p>1,1 ≤ L ≤ R ≤ 1e18. 思路 对于p>2的情况,由于随着指数p的增大,小于1e18的p次幂的数量会急剧减小,总数量的级别在1e6多左右,因此可预处理.L,R不超过1e18,可以直接枚举数字1-1e6,将每个数字不超过1e18的且不是平方数的p次幂推入数组中,排序去重.以便回答询问时可二分求数量. 对于p=2的情况,对上界

Codeforces 955C - Sad powers(数论 + 二分)

链接: http://codeforces.com/problemset/problem/955/C 题意: Q次询问(1≤Q≤1e5),每次询问给出两个整数L, R(1≤L≤R≤1e18),求所有符合条件的整数x的个数.条件为:L≤x≤R,x = a的p次方(a, p为整数且a>0, p>1). 分析: 一.当指数p=3时,底数a最多有1e6个,由于指数增加时底数收敛得很快,所以我们可以将p>=3时的所有x放进vector里排序去重(预处理),求x的个数的时候二分查找即可.二.对于p=

C. Sad powers

You're given Q queries of the form (L, R). For each query you have to find the number of such x that L ≤ x ≤ R and there exist integer numbers a > 0, p > 1 such that x = ap. Input The first line contains the number of queries Q (1 ≤ Q ≤ 105). The ne

CodeForce-955C

C. Sad powerstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou're given Q queries of the form (L, R). For each query you have to find the number of such x that L ≤ x ≤ R and there exist integer

Codeforces Round #486 (Div. 3) D. Points and Powers of Two

Codeforces Round #486 (Div. 3) D. Points and Powers of Two 题目连接: http://codeforces.com/group/T0ITBvoeEx/contest/988/problem/D Description There are n distinct points on a coordinate line, the coordinate of i-th point equals to xi. Choose a subset of

Codeforces 622F The Sum of the k-th Powers(数论)

题目链接 The Sum of the k-th Powers 其实我也不懂为什么这么做的--看了无数题解觉得好厉害哇-- 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 #define dec(i, a, b) for (int i(a); i >= (b); --i) 7 8 const int mod = 1

Codeforces 702B Powers of Two

题目链接:http://codeforces.com/problemset/problem/702/B 题意: 给你N个数a0, a1, a2......an-1,问存在几对 <i,j> 满足i < j, ai + aj = 2x ,x可以是任意整数. 思路: 最容易想到的是把这 n  个数全部两两加起来,然后判断是否是 2 的幂,但是这需要O(n2),题目给的 n <= 1e5,所以会TLE.再思考思考ai + aj = 2x ,那么变下形: aj = 2x - ai ,这样只需

Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees. Find the value of the sum modulo 109 + 7 (so you should find the remainder after dividing the answer by the value 109 + 7).

codeforces 622F. The Sum of the k-th Powers 拉格朗日插值法

题目链接 求sigma(i : 1 to n)i^k. 为了做这个题这两天真是补了不少数论, 之前连乘法逆元都不知道... 关于拉格朗日插值法, 我是看的这里http://www.guokr.com/post/456777/, 还挺有趣... 根据题目给出的例子我们可以发现, k次方的通项公式的最高次是k+1次, 根据拉格朗日插值法, 构建一个k+1次的方程需要k+2项. 然后公式是  , 对于这个题, p[i]就是i^k+(i-1)^k+(i-2)^k+.....+1^k, 这部分可以预处理出