我省没有举办 , 所以不是很急 , 但是希望有人帮助 .
T2
#include<bits/stdc++.h>
#define int __int128
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
int read(void) {
int s=0,f=0; char ch=getchar();
while(!(ch>='0'&&ch<='9')) f=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return f?-s:s;
}
void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
return putchar(x%10+'0'),void();
}
int qpow(int base,int p) {
int ans=1;
while(p) {
if(p&1) ans*=base;
base*=base,p>>=1;
}
return ans;
}
int super_sqrt(int v,int n) { //将 v 开 n 次根
if(n==1) return v;
int r=qpow(2,(60/n)+1),l=1,ans=0;
while(l<=r) {
int mid=l+r>>1;
if(qpow(mid,n)<=v) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int f[1000];
signed main() {
int n=read(),k=read();
f[k]=1;
ffor(i,k+1,60) {
f[i]=1;
ffor(j,1,i-1) if(i%j==0) f[i]-=f[j];
}
int ans=0;
ffor(i,k,60) ans+=f[i]*(super_sqrt(n,i)-1);
write(ans+1);
return 0;
}
能否解释一下 , 不开 O2 能 A , 开了 O2 不能 A 是什么原因 ?