这道超大范围的题目能不能用python求解?

题目描述

这道超大范围的题目能不能用python求解?
这道超大范围的题目能不能用python求解?

题目来源及自己的思路

题目来源
我的代码如下:

l,r,k = map(int,input().split())

def xiangxiaquzheng(a,k):

return int((a**(1/k)))

sum = 0

for x in range(l,r+1):

if x % xiangxiaquzheng(x,k) == 0:

sum +=1

print(sum)

过不了!

相关代码

通过的c++

#include <bits/stdc++.h>

using i64 = long long;

using i128 = __int128;

std::istream &operator>>(std::istream &is, i128 &n) {

n = 0;

std::string s;

is >> s;

for (auto c : s) {

n = 10 * n + c - '0';

}

return is;

}

std::ostream &operator<<(std::ostream &os, i128 n) {

if (n == 0) {

return os << 0;

}

std::string s;

while (n > 0) {

s += '0' + n % 10;

n /= 10;

}

std::reverse(s.begin(), s.end());

return os << s;

}

std::vector<i128> c, cs;

i128 largePower(i128 a, int b) {

i128 ans = 1;

for (; b; b /= 2, a *= a) {

if (b % 2) {

ans *= a;

}

}

return ans;

}

int sqrtk(i128 x, int k) {

i128 l = 0, r = 1E7;

while (l <= r) {

i128 m = (l + r) / 2;

if (largePower(m, k) > x) {

r = m - 1;

} else {

l = m + 1;

}

}

return int(r);

}

i128 calc(i64 x, int k) {

if (x == 0) {

return 0;

}

int y = sqrtk(i128(x), k);

i128 ans = cs[y - 1];

x -= largePower(y, k) - 1;

ans += (x + y - 1) / y;

return ans;

}

std::vector comb(20, std::vector<i128>(20));

int main() {

std::ios::sync_with_stdio(false);

std::cin.tie(nullptr);

i64 l, r;

int k;

std::cin >> l >> r >> k;

comb[0][0] = 1;

for (int i = 1; i < 20; i++) {

comb[i][0] = 1;

for (int j = 1; j < 20; j++) {

comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];

}

}

const int N = sqrtk(r, k) + 2;

c.assign(N, 1);

for (int i = 1; i < N; i++) {

for (int j = 1; j < k; j++) {

c[i] += comb[k][j] * largePower(i, k - j - 1);

}

}

cs.resize(N + 1);

for (int i = 0; i < N; i++) {

cs[i + 1] = cs[i] + c[i + 1];

}

if (k == 1) {

std::cout << r - l + 1 << "\n";

return 0;

}

std::cout << calc(r, k) - calc(l - 1, k) << "\n";

return 0;

}

你期待的结果是什么?实际看到的错误信息又是什么?

这代题目能不能用python解?
范围确实很大,但是就没办法么?


回答:

浮点运算时有误差的,int((a**(1/k))) 的结果并不准确,比如:

>>> print("{:.20f}".format(125**(1/3)))

4.99999999999999911182

你看 C++ 里都是用整数乘方之后比大小的,而不是直接开方下取整。

以上是 这道超大范围的题目能不能用python求解? 的全部内容, 来源链接: utcz.com/p/938996.html

回到顶部