社区讨论

求助,第二个点跑都跑不出来

P3768简单的数学题参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7pdx7f
此快照首次捕获于
2025/11/21 01:26
4 个月前
此快照最后确认于
2025/11/21 01:26
4 个月前
查看原帖
输入:1000000007 9786510294
答案:27067954
跑不出来
CPP
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define I inline 
using namespace std;
typedef long long ll;
const int N=8e5;
map<ll ,ll > sg;
ll M;
ll ps[N+10],inv1,ans;
I ll pm(ll x,ll p){ll res=1;while(p){if(p&1)res=res*x%M;p>>=1;x=x*x%M;}return res;}
I ll s2(ll n){n%=M;return 1ll*n*(n+1)%M*(n+n+1)%M*inv1%M;}
I ll s1(ll n){n%=M;return ((n*(n+1))>>1)%M;}
I ll dec(ll x,ll y){return x>y?x-y:x+M-y;}
ll fs(ll n){
	if(n<=N)return ps[n];
	if(sg.count(n))return sg[n];
	ll na=s1(n);
	ll res=na*na%M;
	for(int i=2,r=0;i<=n;i=r+1){
		r=n/(n/i);
		res=dec(res,dec(s2(r),s2(i-1))*fs(n/i)%M);
	}
	return sg[n]=res;
}
ll pri[N+10],p=0,v[N+10],phi[N+10],n;
void pre(){
	phi[1]=1;
	for(ll i=2;i<=N;i++){
		if(!v[i])pri[++p]=i,phi[i]=i-1;
		for(int j=1;j<=p&&i*pri[j]<=N;j++){
			v[pri[j]*i]=1;
			if(i%pri[j]==0){
				phi[i*pri[j]]=phi[i]*pri[j];
				break;
			}
			else{phi[i*pri[j]]=phi[i]*(pri[j]-1);}
		}
	}
	for(int i=1;i<=N;i++){
		ps[i]=(ps[i-1]+phi[i]*i%M*i%M)%M;
	}
}
int main(){
	scanf("%lld%lld",&M,&n);
	inv1=pm(6,M-2);
	pre();
	//for(int i=1;i<=N;i++)printf("%lld\n",ps[i]);
	
	for(ll i=1,j=0;i<=n;i=j+1){
		j=n/(n/i);
		ll nc=s1(n/i);
		ans=(ans+nc*nc%M*dec(fs(j),fs(i-1))%M)%M;
	}
	printf("%lld",ans);
	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...