[BZOJ 4804] 오라 암산: 모비우스 역습

여기를 클릭하여 원제를 보십시오
일련의 반전을 거쳐
ans(n)=∑T=1n⌊nT⌋∗⌊nT⌋∗∑i|Tφ(i)∗μ(Ti)
(알 수 없는 조언은 일단 BZOJ 2820을 하자.)
그래서 이제 맞아요.
∑i|Tφ(i)∗μ(Ti) 접두사와 이것을 구하려면 분류 토론이 필요하고 구체적으로 코드를 보아야 한다
/*
User:Small
Language:C++
Problem No.:4804
*/
#include
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e7+5;
int n,h[M],prime[M],cnt;
bool not_prime[M];
ll ans,sum[M];
void solve(){
    ans=0;
    scanf("%d",&n);
    for(int i=1,r;i<=n;i=r+1){
        r=n/(n/i);
        ans+=(ll)(n/i)*(n/i)*(sum[r]-sum[i-1]);
    }
    printf("%lld
"
,ans); } int main(){ h[1]=1; for(int i=2;i<=1e7;i++){ if(!not_prime[i]){ prime[++cnt]=i; h[i]=i-2; } for(int j=1;j<=cnt&&i*prime[j]<=1e7;j++){ not_prime[i*prime[j]]=1; if(i%prime[j]==0){ if(i/prime[j]%prime[j]==0) h[i*prime[j]]=h[i]*prime[j]; else h[i*prime[j]]=h[i/prime[j]]*(prime[j]-1)*(prime[j]-1); break; } h[i*prime[j]]=h[i]*h[prime[j]]; } } for(int i=1;i<=1e7;i++) sum[i]=sum[i-1]+h[i]; int t; scanf("%d",&t); while(t--) solve(); return 0; }

좋은 웹페이지 즐겨찾기