有大大知道为什么本地跑得了的代码会0msTLE吗
查看原帖
有大大知道为什么本地跑得了的代码会0msTLE吗
903392
T7_Daniel楼主2023/11/4 08:17
#include<bits/stdc++.h>
using namespace std;
bitset<10000010> vk;
__int128 tot=0,prime[10000010],mky[10000010];
void prepare(){
	mky[1]=1;
	for(int i=2; i<=1e7; ++i){
		if(!vk[i]) prime[++tot]=i,mky[i]=-1;
		for(__int128 j=1; j<=tot && i*prime[j]<=1e7; ++j){
			vk[i*prime[j]]=1;
			if(i%prime[j]==0){
				mky[i*prime[j]]=0;
				break;
			}
			mky[i*prime[j]]=-mky[i];
		}
	}
}
__int128 n;
__int128 uans(int n){
	__int128 ans=0,sqr=sqrt(n);
	for(__int128 i=1; i<=sqr; ++i) ans+=(n/i)*i+(__int128)(n/i)*(n/i+1)/2;
	return ans-(__int128)sqr*(sqr+1)/2*sqr;
}

__int128 read(){
	__int128 s=0,f=1;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
		s=s*10+ch-'0',ch=getchar();
	return s*f;
}

void write(__int128 x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

int main(){
	prepare();
	__int128 t; 
	t=read();
	while(t--){
		n=read();
		long double p=n;
		__int128 tmp=sqrt(p),ans=0;
		for(__int128 i=1; i<=tmp; ++i)
			ans+=mky[i]*i*uans(n/i/i);
		write(ans);
		cout<<endl;
	}
	return 0;
}
2023/11/4 08:17
加载中...