BZOJ 4916ベン神とこんにゃく

アイデア:ドゥは、ふるいを教えます

提出:\(2 \)

:のエラー\(SUM \)エラーを法で機能

ソリューション:

まず、聞いて最初の質問は、検出されたIQです:\(\ sum_ {i = 1} ^ N- \ MU(I ^ 2)\)明らかに\(1 \)は
2つ目の質問は、杜の篩は、私が読んで子供の事があった教え、実際にあります様:
\(F = \ varphi(I ^ 2)= \ varphi(I)\ CDOT I \)
\(S(N)= \ sum_ 1 = {I}} ^ {N-F(I)\)。
式:
\(ID = 2 ^ F \ CDOT ID \)
ので、式は、となった
\(1つの\ CDOT S(N )= \ sum_ {i = 1} ^ {n}はI ^ 2- \ sum_ { I = 2} ^ {n}は iがCDOT S(\ FRAC {n}は{I}を)\ \)

#include<cstdio>
#include<iostream>
#include<map>
#define ll long long
#define R register int
using namespace std;
namespace Luitaryi {
template<class I> inline I g(I& x) { x=0; register I f=1;
    register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
    do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
} const int N=5000000,M=1e9+7,Inv=166666668;
int n,cnt,p[N+10];
ll phi[N+10]; bool v[N+10];
map<int,ll> mem;
inline void PRE() { v[1]=phi[1]=1;
    for(R i=2;i<=N;++i) {
        if(!v[i]) p[++cnt]=i,phi[i]=i-1;
        for(R j=1;j<=cnt&&i*p[j]<=N;++j) {
            v[i*p[j]]=true;
            if(i%p[j]==0) {
                phi[i*p[j]]=phi[i]*p[j]; break;
            } phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    } for(R i=1;i<=N;++i) phi[i]=(1ll*phi[i]*i%M+phi[i-1])%M;
}
inline ll sum(ll x) {return 1ll*x*(x+1)%M*(2*x+1)%M*Inv%M;}
inline ll query(ll x) {return 1ll*x*(x+1)/2%M;}
inline ll solve(int n) {
    if(n<=N) return phi[n];
    if(mem.count(n)) return mem[n]; 
    register ll ret=sum(n);
    for(R l=2,r;l<=n;l=r+1) 
        r=min(n/(n/l),n),ret-=(query(r)-query(l-1))%M*solve(n/l)%M,ret=(ret+M)%M;
    return mem[n]=ret;
}
inline void main() {PRE(); g(n); printf("1\n%lld\n",solve(n));}
} signed main() {Luitaryi::main(); return 0;}

2019年8月23日24 \
77 \ 76

おすすめ

転載: www.cnblogs.com/Jackpei/p/11404541.html