[BZOJ3944] Sum - 杜教筛

我蒟蒻讲不清 = =

#include "stdio.h"
#include "algorithm"
#include "iostream"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "vector"
#include "map"
#include "set"
 
using namespace std;
typedef long long ll;
 
const int N = 0x7fffffff, M = 5000000;
const int PRIMENUM = 1000000, S = M + 5;
 
bool flag[S];int pri[PRIMENUM],num;
ll seu[S],n,smu[S];
 
void build(){
    flag[1]=smu[1]=seu[1]=1;
    for(int i=2;i<=M;i++){
        if(flag[i]^1){
            pri[++num]=i;
            smu[i]=-1;seu[i]=i-1;
        }
        for(int j=1;pri[j]*i<M;j++){
            int k=i*pri[j];flag[k]=true;
            if(i%pri[j]==0){seu[k]=seu[i]*pri[j],smu[k]=0;break;}
            else seu[k]=seu[i]*(pri[j]-1),smu[k]=-smu[i];
        }
    }
    for(int i=1;i<=M;i++)smu[i]+=smu[i-1],seu[i]+=seu[i-1]; 
}
 
ll deu[1500],dmu[1500];
bool veu[1500],vmu[1500];
 
__attribute__((optimize("-O3")))
ll ans1(ll x){
    if(x<=M)return seu[x];int t=n/x;
    if(veu[t])return deu[t];veu[t]=true;
    int i,last;ll ans=x*(ll)(x+1)/2;
    for(i=2;i-1<=x-1;i=last+1){
        last=x/(x/i);
        ans-=(last-i+1)*ans1(x/i);
    }
    return deu[t]=ans;
}
 
__attribute__((optimize("-O3")))
ll ans2(ll x){
    if(x<=M)return smu[x];int t=n/x;
    if(vmu[t])return dmu[t];
    vmu[t]=true;int i,last;ll ans=1;
    for(i=2;i-1<=x-1;i=last+1){
        last=x/(x/i);
        ans-=(last-i+1)*ans2(x/i);
    }
    return dmu[t]=ans;
}
 
int main(){
    build();int T;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(deu,0,sizeof(deu));
        memset(dmu,0,sizeof(dmu));
        memset(veu,false,sizeof(veu));
        memset(vmu,false,sizeof(vmu));
        printf("%lld %lld\n",ans1(n),ans2(n));
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值