欧拉函数求和 解题报告

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

Input

输入一个数N。(2 <= N <= 10^10)

Output

输出S(n) Mod 1000000007的结果。

Input示例

5

Output示例

10代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a) for(int i=last[a];i;i=next[i])
#define N 5000000
using namespace std;
typedef long long ll;
const int Mo=1000000007;
const int mo=2333333;
const int ni=500000004;
int phi[N+5],p[N+5],l;
int last[mo],next[mo];
bool bz[N+5];
ll n,t[mo],v[mo];
void add(int x,ll y,ll z) {
t[++l]=y;v[l]=z;next[l]=last[x];last[x]=l;
}
ll calc(ll x) {
if (x<=N) return phi[x];int k=x%mo;ll ans=0,z=x%Mo;
rep(i,k) if (t[i]==x) return v[i];
for(ll l=2,r;l<=x;l=r+1) r=x/(x/l),(ans+=(r-l+1)%Mo*calc(x/l)%Mo)%=Mo;
ans=(z*(z+1)%Mo*ni%Mo-ans+Mo)%Mo;
add(k,x,ans);
return ans;
}
int main() {
fo(i,2,N) {
if (!bz[i]) p[++p[0]]=i,phi[i]=i-1;
fo(j,1,p[0]) {
int k=i*p[j];if (k>N) break;
bz[k]=1;if (!(i%p[j])) {phi[k]=phi[i]*p[j];break;}
phi[k]=phi[i]*(p[j]-1);
}
}
phi[1]=1;fo(i,1,N) (phi[i]+=phi[i-1])%=Mo;
scanf("%lld",&n);printf("%lld",calc(n));
}

时间: 2024-10-12 13:09:40

欧拉函数求和 解题报告的相关文章

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=

【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

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

HDU - 1286 找新朋友(欧拉函数)解题

找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13024    Accepted Submission(s): 6941 Problem Description 新年快到了,"猪头帮协会"准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有

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

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

[poj 2480] Longge&#39;s problem 解题报告 (欧拉函数)

题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<algorithm> #include<cstdio> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int N=(1<<31)+15;