社区讨论

为什么提交的程序输出答案跟本地不一样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 条回复,欢迎继续交流。

正在加载回复...