【BZOJ4805】欧拉函数求和(杜教筛)

【BZOJ4805】欧拉函数求和(杜教筛)

题面

BZOJ

题解

好久没写过了
正好看见了顺手切一下
令\[S(n)=\sum_{i=1}^n\varphi(i)\]
设存在的某个积性函数\(g(x)\)
\[(g*\varphi)(i)=\sum_{d|i}g(d)\varphi(\frac{i}{d})\]
\[\sum_{i=1}^n(g*\varphi(i))(i)\]
\[=\sum_{i=1}^n\sum_{d|i}g(d)\varphi(\frac{i}{d})\]
\[=\sum_{d=1}^ng(d)\sum_{d|i}\varphi(\frac{i}{d})\]
\[=\sum_{d=1}^ng(d)\sum_{i=1}^{n/i}\varphi(i)\]
\[=\sum_{d=1}^ng(d)S(\frac{n}{d})\]

拿出杜教筛的套路柿子
\[g(1)S(n)=\sum_{i=1}^n(g*\varphi)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]

我们知道\((\varphi*1)=x\)
\[S(n)=\sum_{i=1}^ni-\sum_{i=2}^nS(\frac{n}{i})\]
\[S(n)=\frac{n(n+1)}{2}-\sum_{i=2}^nS(\frac{n}{i})\]

预处理\(10^7\)然后杜教筛美滋滋

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 10000000
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
int pri[MAX+10],tot;
bool zs[MAX+10];
ll phi[MAX+10];
void pre()
{
    zs[1]=true;phi[1]=1;
    for(int i=2;i<=MAX;++i)
    {
        if(!zs[i])pri[++tot]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&pri[j]*i<=MAX;++j)
        {
            zs[i*pri[j]]=true;
            if(i%pri[j])phi[i*pri[j]]=phi[i]*phi[pri[j]];
            else{phi[i*pri[j]]=phi[i]*pri[j];break;}
        }
    }
    for(int i=1;i<=MAX;++i)phi[i]+=phi[i-1];
}
map<ll,ll> M;
ll Solve(ll x)
{
    if(x<=MAX)return phi[x];
    if(M[x])return M[x];
    ll ret=0;
    for(ll i=2,j;i<=x;i=j+1)
    {
        j=x/(x/i);
        ret+=(j-i+1)*Solve(x/i);
    }
    return M[x]=x*(x+1)/2-ret;
}
int main()
{
    pre();
    int n=read();
    printf("%lld\n",Solve(n));
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8460345.html

时间: 2024-11-01 22:59:00

【BZOJ4805】欧拉函数求和(杜教筛)的相关文章

BZOJ4805: 欧拉函数求和(杜教筛)

4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discuss] Description 给出一个数字N,求sigma(phi(i)),1<=i<=N Input 正整数N.N<=2*10^9 Output 输出答案. Sample Input 10 Sample Output 32 HINT Source By FancyCoder 直接大力杜教筛

【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛

[BZOJ3944]Sum 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 题解: 粘自http://blog.csdn.net/skywalkert/article/details/

Bzoj4805: 欧拉函数求和

好久没写杜教筛了 练练手AC量刷起 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e7 + 1); IL int Input(){ RG int x = 0, z = 1; RG char c = getchar

poj3090欧拉函数求和

E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0

NYOJ 570 欧拉函数求和【欧拉函数求和】

我只想说数据弱爆了,这也可以过 欧拉函数求和 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目描述很简单,求出 (PS:上面式子的意思是大于0小于n并且能整除n的所有d的欧拉函数值之和). 输入 每行一个数n(n<2^31),输入以文件结尾结束. 输出 每个结果占一行. 样例输入 1 2 12 样例输出 0 1 8 来源 rihkddd原创 上传者 rihkddd #include<stdio.h> int euler(int n) { int ret=

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数\(\mu(n)\)为: 当n有平方因子时,\(\mu(n)=0\). 当n没有平方因子时,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同质因子的个数. 性质1: \(\sum_{d|n}\mu(d)=[n=1]\) 证明:我们把n分解质因数,则原式\(=(-1+1)^{\omega(n)}=0\). 因为对于不同的质因子,只有选和不选两种方案,这是一个组合数相加的形式,偶数加奇数减,根据二项式

莫比乌斯函数与杜教筛

前人的文章已经很详尽了,这里只作一点补充. 莫比乌斯反演与莫比乌斯函数入门资料:https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html 讲的非常清楚,这里稍微补充一下: 1.虽然考试肯定不会考,但是对于定理的证明还是应该大概了解一下的.关于欧拉函数φ与莫比乌斯函数μ,由于它们都是积性函数,所以很多性质都可以用类似数学归纳法的方法证明.过程是:(1)对于一个性质证明在x为素数是成立 (2)对于素数p和一个正整数a,设此性质对a与p均成立

欧拉函数求和 解题报告

对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等.例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质. S(n) = Phi(1) + Phi(2) + ...... Phi(n),给出n,求S(n),例如:n = 5,S(n) = 1 + 1 + 2 + 2 + 4 = 10,定义Phi(1) = 1.由于结果很大,输出Mod 1000000007的结