80pts,#1,#6错了的同学可以看一下
查看原帖
80pts,#1,#6错了的同学可以看一下
306734
phil071128楼主2021/10/19 12:18

Rt 注意循环中的j也要开long long

#include <bits/stdc++.h>
using namespace std;
const int N=30000010;
unsigned long long n; 
const int mod=1e9+7;
bool vis[N];
unsigned long long prime[N]; 
int cnt;
void xian(){
	memset(vis,1,sizeof vis);
	for(int i=2;i<=n;i++){
		if(vis[i]) prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			vis[i*prime[j]]=0;
			if(i%prime[j]==0) break;
		}
	}
}
unsigned long long c[N];
int main(){
	cin>>n;
	xian();
//	cout<<prime[2]<<" "; 
	for(int i=1;i<=cnt;i++){
		int P=prime[i];
		for(unsigned long long j=P;j<=n;j*=P) c[i]=(c[i]%mod+(n/j)%mod)%mod;//注意这里j也要开longlong.
        
     
		c[i]%=mod;
	}
	unsigned long long ans=1;
	for(int i=1;i<=cnt;i++){
		ans=(ans%mod*(c[i]*2+1)%mod);
		ans=ans%mod;
	}
	cout<<ans;
	return 0;
}

2021/10/19 12:18
加载中...