3944: Sum(杜教筛)

3944: Sum

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 4930  Solved: 1313
[Submit][Status][Discuss]

Description

Input

一共T+1行

第1行为数据组数T(T<=10)

第2~T+1行每行一个非负整数N,代表一组询问

Output

一共T行,每行两个用空格分隔的数ans1,ans2

Sample Input

6
1
2
8
13
30
2333

Sample Output

1 1
2 0
22 -2
58 -3
278 -3
1655470 2

杜教筛

/*
    就相当于111112222222333333333每个数都有相同的一坨,然后只算出一坨的第一个数,乘个他的次数,直接跳到下一坨
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 5000005
#define N 5000000
using namespace std;
int p[maxn],mu[maxn],cnt;
long long phi[maxn];
bool vis[maxn];
void prepare(){
    memset(vis,0,sizeof(vis));
    phi[1]=1;mu[1]=1;
    for(int i=2;i<=N;i++){
        if(!vis[i])p[++cnt]=i,phi[i]=i-1,mu[i]=-1;
        for(int j=1;j<=cnt&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                phi[i*p[j]]=phi[i]*p[j];
                mu[p[j]*i]=0;break;
            }
            phi[i*p[j]]=phi[i]*phi[p[j]];
            mu[i*p[j]]=-mu[i];
        }
    }
    for(int i=1;i<=N;i++)phi[i]+=phi[i-1],mu[i]+=mu[i-1];
}
map<long long,long long>lst_phi;
map<long long,int>lst_mu;
long long sum_phi(long long n){
    if(n<=N)return phi[n];
    if(lst_phi[n]!=0)return lst_phi[n];
    long long res=n*(n+1)/2;
    for(long long i=2,nxt;i<=n;i=nxt+1){
        nxt=n/(n/i);
        res-=sum_phi(n/i)*(nxt-i+1);
    }
    return lst_phi[n]=res;
}
int sum_mu(long long n){
    if(n<=N)return mu[n];
    if(lst_mu[n]!=0)return lst_mu[n];
    int res=1;
    for(long long i=2,nxt;i<=n;i=nxt+1){
        nxt=n/(n/i);
        res-=sum_mu(n/i)*(nxt-i+1);
    }
    return lst_mu[n]=res;
}
int main(){
    freopen("Cola.txt","r",stdin);
    prepare();
    int Q;scanf("%d",&Q);
    while(Q--){
        int n;scanf("%d",&n);
        cout<<sum_phi(n)<<‘ ‘<<sum_mu(n)<<endl;
    }
}

原文地址:https://www.cnblogs.com/thmyl/p/8261674.html

时间: 2024-10-09 07:20:34

3944: Sum(杜教筛)的相关文章

bzoj 3944 Sum —— 杜教筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-shadow/p/8491542.html 写法模仿其他博客的,但很慢啊... 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<ma

3944: Sum[杜教筛]

3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3471  Solved: 946[Submit][Status][Discuss] Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans2 Sample Input 6 1 2 8 13 30 2333 Sample Output 1 1

BZOJ.3944.Sum(杜教筛)

题目链接 又写个模板题用了半晚上.. 卡常写法 还非常短.. //35332 kb 7608 ms //跟Kelin dalao学一波卡常.怎么还是很慢QAQ //phi[]要longlong! #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; const int N=2e6; int cnt,Max,P[N>>3]; LL phi[N],mu[N]

洛谷P4213 Sum(杜教筛)

题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1?=∑i=1n??(i),ans2?=∑i=1n?μ(i) 输入输出格式 输入格式: 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 输出格式: 一共T行,每行两个用空格分隔的数ans1,ans2 输入输出样例 输入样例#1: 复制 6 1 2 8 13 30 2

●杜教筛入门(BZOJ 3944 Sum)

入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\frac{3}{4}})$的复杂度内解决求某些数论函数f(n)(或f的前缀和S(n)$)的值. 先来看看原理是什么.(接下来推导如何求数论函数f(n)的前缀和S(n)) 现在有两个数论函数$f( )和g( )$ (同时定义f的前缀和函数$S(n)=\sum_{i=1}^{n}f(i)$) 有狄利克雷乘

P4213 【模板】杜教筛(Sum)

\(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varphi(i) \end{aligned}\) \(\begin{aligned} ans_2=\sum_{i=1}^n \mu(i) \end{aligned}\) \(\color{#0066ff}{输 入 格 式}\) 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N

【模板】杜教筛(Sum)

传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \mu(i)\] Solution 总算是写了一个不会\(TLE\)的杜教筛,不想用\(map\),因此上了一个很丑的\(Hash\)-- Code #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(

P4213【模板】杜教筛(Sum)

思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h=f*g\),并且\(h\)的前缀和易求,\(g\)的区间和易求. 具体地: \[\sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)\cdot f(\frac{i}{d})\] \[\sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\

杜教筛 学习总结

看了看唐老师的blog,照猫画虎的做了几道题目,感觉对杜教筛有些感觉了 但是稍微有一点难度的题目还是做不出来,放假的时候争取都A掉(挖坑ing) 这篇文章以后等我A掉那些题目之后再UPD上去就好啦 由于懒得去写怎么用编辑器写公式,所以公式就准备直接copy唐老师的啦 首先积性函数和完全积性函数什么的就不再多说了 列举常见的积性函数: 1.约数个数函数和约数个数和函数 2.欧拉函数phi 3.莫比乌斯函数mu 4.元函数e 其中e(n)=[n==1] 5.恒等函数I 其中I(n)=1 6.单位函数