代码如下:
#include <bits/stdc++.h>
using namespace std;
map<int,bool> mp;
// input & output for __int128 which is larger than long long
#define int __int128
inline void read(int &n){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
n=x*f;
}
inline void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n % 10 + '0');
}
int sqrt(int m)
{
int l = 0,r = m, re;
while (l <= r)
{
int mid = (l+r) / 2;
if (mid*mid > m)
{
r = mid - 1;
}
else
{
l = mid + 1;
re = mid;
}
}
// print(re);
return re;
}
int D[1000005] = {0};
int luopow(int a,int b)
{
int re = 1;
int ta = a;
if (D[ta] == 0)
{
while(b)
{
if(b&1)
{
re *= a;
}
a *= a;
b >>= 1;
}
D[ta] = re;
} else
{
D[ta] = D[ta] * ta;
re = D[ta];
}
return re;
}
signed main()
{
int n,k;
int ans = 0;
read(n);
read(k);
int rk = k;
if(n >= 1) {
mp[1] = 1;
ans++;
}
if (k==1)
{
ans += (n - 1);
}
else
{
if (k == 2) {
ans += (sqrt(n) - 1);
k++;
}
while(k <= 100 && luopow(2,k) <= n)
{
int i = 2;
if (mp[D[2]] == 0)
{
mp[D[2]] = 1;
ans++;
}
while(D[i] <= n)
{
int j = D[i];
if (!mp[j] && rk > 2)
{
ans++;
mp[j] = 1;
}
i++;
luopow(i,k);
}
k++;
}
}
print(ans);
return 0;
}
#undef int
4096的3次方无法计数增加ans,求问各位大佬是什么原因呢?