【求助】WA了三个点,大数据对拍不上
查看原帖
【求助】WA了三个点,大数据对拍不上
170212
geray_king楼主2020/11/25 20:20

找了个对的对拍发现4e9的样例就不对了。 找了很久没找到漏取模的地方,是哪里漏了吗? 还是写错了qaq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
inline bool isprime(ll num)
{if(num==2||num==3)return true;
    if(num%6!=1&&num%6!=5)return false;
    for(int i=5;1ll*i*i<=num;i+=6){if(num%i==0||num%(i+2)==0)return false;}
    return true;}
const int mod = 1e9+7;
inline ll mul(ll a,ll b,ll c){return (a*b-(ll)((ld)a*b/c)*c+c)%c;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll g = exgcd(b,a%b,y,x);y-=a/b*x;return g;}
inline ll quick_pow(ll a,ll b,ll mod){ll res=1;while(b){if(b&1)res=mul(res,a,mod);a=mul(a,a,mod);b>>=1;}return res;}
inline ll quick_pow(ll a,ll b){ll res=1;while(b){if(b&1)res=mul(res,a,mod);a=mul(a,a,mod);b>>=1;}return res;}
inline ll inv(ll x){return quick_pow(x,mod-2);}
inline ll inv(ll x,ll mod){return quick_pow(x,mod-2,mod);}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
const int N = 1e6+10;
ll n,g[N],h[N],w[N],sn,id,inv6,inv2;
ll ppre1[N],ppre2[N];
ll prime[N],cnt,id1[N],id2[N];
bool vis[N];
ll Id(ll x){
    return x<=sn?id1[x]:id2[n/x];
}
void init(){
    for(int i=2;i<N;i++){
        if(!vis[i]){
            prime[++cnt]=i;
            ppre1[cnt]=(ppre1[cnt-1]+i)%mod;
            ppre2[cnt]=(ppre2[cnt-1]+1ll*i*i%mod)%mod;
        }
        for(int j=1;j<=cnt&&1ll*i*prime[j]<N;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0){
                break;
            }
        }
    }
}
ll sum3(ll x){
    return x*(x+1)%mod*((2*x+1)%mod)%mod*inv6%mod;
}
ll sum2(ll x){
    return x*(x+1)%mod*inv2%mod;
}
ll f(ll x){
    if(x==1)return 0;
    x%=mod;
    return x*(x-1)%mod;
}
ll S(ll x,int y){
    if(x<=1 || prime[y]>x)return 0;
    ll k = Id(x);
    ll res = ( ((g[k] - ppre2[y-1]+mod)%mod) - ((h[k] - ppre1[y-1]+mod)%mod) + mod)%mod;
    for(int i=y;i<=cnt&&1ll*prime[i]*prime[i]<=x;i++){
        ll t1 = prime[i], t2 = 1ll*prime[i]*prime[i];
        for(;t2<=x;t1=t2,t2*=prime[i]){
            res += ((S(x/t1,i+1) * f(t1))%mod + f(t2)%mod)%mod;
            res%=mod;
        }
    }
    return res%mod;
}
int main(){
 inv6 = inv(6);
 inv2 = inv(2);
 init();
 scanf("%lld",&n);
 sn = sqrt(n);
 for(ll l=1,r;l<=n;l=r+1){
     r = n/(n/l);w[++id]=n/l;
     g[id] = sum3(w[id]);
     g[id] = (g[id] - 1 + mod )%mod;
     h[id] = sum2(w[id]);
     h[id] = (h[id] - 1 + mod)%mod;
     if(w[id]<=sn)id1[w[id]] = id;
     else id2[r] = id;
 }
 ll pre1 = 0, pre2 = 0;
 for(int j=1;j<=cnt;j++){
     ll t2 = prime[j]*prime[j]%mod;
     ll t1 = prime[j];
     for(int i=1;i<=id&&1ll*prime[j]*prime[j]<=w[i];i++){
         ll k = Id(w[i]/prime[j]);
         (g[i]-= t2*(g[k] - pre2)%mod)%=mod;
         g[i]=(g[i]+mod)%mod;
         (h[i]-= t1*(h[k] - pre1)%mod)%=mod;
         h[i]=(h[i]+mod)%mod;
     }
     (pre2+=t2)%=mod;
     (pre1+=t1)%=mod;
 }
 ll ans = S(n,1) + 1;
 printf("%lld\n",(ans+mod)%mod);
}
2020/11/25 20:20
加载中...