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();
    for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
    for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return x * z;
}

int prime[_], num, n, tot;
ll phi[_];
map <ll, ll> Phi;
bool isprime[_];

IL void Sieve(RG int m){
    isprime[1] = 1, phi[1] = 1, tot = m;
    for(RG int i = 2; i <= m; ++i){
        if(!isprime[i]) prime[++num] = i, phi[i] = i - 1;
        for(RG int j = 1; j <= num && i * prime[j] <= m; ++j){
            isprime[i * prime[j]] = 1;
            if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1);
            else{
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
        }
    }
    for(RG int i = 2; i <= m; ++i) phi[i] += phi[i - 1];
}

IL ll S(RG ll x){
    return x * (x + 1) >> 1;
}

IL ll Du_Sieve(RG ll m){
    if(m <= tot) return phi[m];
    if(Phi[m]) return Phi[m];
    RG ll ret = m * (m + 1) >> 1;
    for(RG int i = 2, j; i <= m; i = j + 1){
        j = m / (m / i);
        ret -= 1LL * (j - i + 1) * Du_Sieve(m / i);
    }
    return Phi[m] = ret;
}

int main(RG int argc, RG char* argv[]){
    n = Input();
    Sieve(pow(n, 2.0 / 3.0));
    printf("%lld\n", Du_Sieve(n));
    return 0;
}

原文地址:https://www.cnblogs.com/cjoieryl/p/8460377.html

时间: 2024-10-09 23:34:12

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 直接大力杜教筛

【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

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=

欧拉函数求和 解题报告

对正整数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的结

【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/

BZOJ 4805: 欧拉函数求和

Description 求\(\sum_{i=1}^n\varphi(i),n\leqslant 2\times 10^9\) Solution 杜教筛... 见上篇... Code /************************************************************** Problem: 4805 User: BeiYu Language: C++ Result: Accepted Time:1100 ms Memory:48172 kb ********

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法

相关逆元求法,我之前有写过,还有欧拉函数的求法,欧拉函数与逆元的关系  点击 POJ 2478 又是一个打表的题目,一眼看出结果就是前n个欧拉函数值的和. 这里直接计算欧拉函数值求和会超时,看见多组数据. 然后就是计算欧拉函数,打表就好了. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N =

[BZOJ 2705][SDOI 2012]Longge的问题(欧拉函数)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2705 网上的题解都不是很靠谱,我就来YY下自己的思路吧... 首先,对于1<=i<=N,gcd(i,N)的可能性解就是N的约数.那么这个题就是求Σgcd(i,N)=k,k是n的因数,等价于求Σgcd(i/k,N/k)=gcd(i',N/k)=1,即找出所有与N/k互质且小于等于N/k的i'的个数,这就转化到求欧拉函数的问题上来了. 所以这个题的做法是,sqrt(N)复杂度内枚举