社区讨论
求助,第二个点跑都跑不出来
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 条回复,欢迎继续交流。
正在加载回复...