社区讨论
为什么提交的程序输出答案跟本地不一样qwq
P3768简单的数学题参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6n5pe3
- 此快照首次捕获于
- 2025/11/20 07:36 4 个月前
- 此快照最后确认于
- 2025/11/20 07:36 4 个月前
我的程序输出第一个点的正确答案,评测结果非得说我输出了36558什么什么玩意
qwq
CPP#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 2000200
using namespace std;
int mod;
inline long long read(){
long long num=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)){
num=num*10+ch-'0';
ch=getchar();
}
return num*f;
}
bool s[maxn];
int prime[maxn],tot;
int miu[maxn];
long long f[maxn];
int val[maxn],cnt;
inline long long mul(long long x,int e,int p){
long long ret=1;
while(e){
if(e&1) ret=(ret*x)%p;
x=(x*x)%p;
e>>=1;
}
return ret;
}
inline long long calc(long long x,long long n,int p){
long long ans=( ( (x+(n/x)*x%p)*(n/x)%p )*mod)%p;
ans=(ans*ans)%p;
return ans;
}
long long ANS;
int main(){
int p,n;cin>>p>>n;
mod=mul(2,p-2,p);
miu[1]=1;
for(register int i=2;i<=maxn;++i){
if(!s[i]){
prime[++tot]=i;
miu[i]=-1;
}
for(int j=1;j<=tot&&i*prime[j]<=maxn;++j){
s[i*prime[j]]=1;
if(i%prime[j]) miu[i*prime[j]]=-miu[i];
else break;
}
}
{
int x=1;
while(x<=n){
int y=n/(n/x);
val[++cnt]=n/x;
x=y+1;
}
}
sort(val+1,val+cnt+1);
for(register int i=1;i<=cnt;++i){
int t=val[i];
long long now=0;
for(register int w=1;w<=t;++w) now=(now+(miu[w]*calc(w,t,p))%p)%p;
f[i]=now;
}
{
int x=1;
while(x<=n){
int to=lower_bound(val+1,val+cnt+1,n/x)-val;
long long y=n/(n/x);
long long sumy=mul( ((long long)(1+y)*(long long)y)>>1,2,p);
long long sumx=mul( ((long long)x*(long long)(x-1))>>1,2,p);
//printf("%d %d %lld %lld %lld\n",x,y,sumx,sumy,f[n/x]);
ANS=(ANS+((sumy-sumx+p)%p)*f[to])%p;
x=y+1;
}
}
/*for(int i=1;i<=n;++i){
long long now=0;
for(int j=i;j<=n;j+=i){
now+=miu[j/i]*calc(j,n,p);
now%=p;
}
ans=(ans+(now*(long long)i))%p;
}*/
cout<<(long long)ANS;
return 0;
}
/*998244353 3*/
回复
共 3 条回复,欢迎继续交流。
正在加载回复...