紫书 例题 10-7 UVa10820 欧拉函数

来源:互联网 发布:安卓手机优化 编辑:程序博客网 时间:2024/05/25 05:35

题意:求1~n之间共有多少对互质的数
分析:如果用普通方法一个一个判断,时间复杂度是O(n^2),会超时。但是可以利用欧拉函数和筛法在O(nloglogn)时间内把50000内与每个数互质的正整数的个数求出来。当求有多少对时,只需令sum[n]*2 —1即可。
解题方法:

////Created by BLUEBUFF 2016/1/11//Copyright (c) 2016 BLUEBUFF.All Rights Reserved//#pragma comment(linker,"/STACK:102400000,102400000")//#include <ext/pb_ds/assoc_container.hpp>//#include <ext/pb_ds/tree_policy.hpp>//#include <ext/pb_ds/hash_policy.hpp>//#include <bits/stdc++.h>#include <set>#include <map>#include <queue>#include <stack>#include <cmath>#include <cstdio>#include <time.h>#include <cstdlib>#include <cstring>#include <complex>#include <sstream> //isstringstream#include <iostream>#include <algorithm>using namespace std;//using namespace __gnu_pbds;typedef long long LL;typedef unsigned long long uLL;typedef pair<int, LL> pp;#define REP1(i, a, b) for(int i = a; i < b; i++)#define REP2(i, a, b) for(int i = a; i <= b; i++)#define REP3(i, a, b) for(int i = a; i >= b; i--)#define CLR(a, b)     memset(a, b, sizeof(a))#define MP(x, y)      make_pair(x,y)template <class T1, class T2>inline void getmax(T1 &a, T2 b) { if (b>a)a = b; }template <class T1, class T2>inline void getmin(T1 &a, T2 b) { if (b<a)a = b; }const int maxn = 50010;const int maxm = 1e5+5;const int maxs = 10;const int maxp = 1e3 + 10;const int INF  = 1e9;const int UNF  = -1e9;const int mod  = 1e9 + 7;const int rev = (mod + 1) >> 1; // FWTconst double PI = acos(-1);//headvoid phi_table(int n, int *phi){    for(int i = 2; i <= n; i++) phi[i] = 0;    phi[1] = 1;    for(int i = 2; i <= n; i++){        if(!phi[i]){            for(int j = i; j <= n; j += i){                if(!phi[j]) phi[j] = j;                phi[j] = phi[j] / i * (i - 1);            }        }    }}int phi[maxn], sum[maxn];int main(){    phi_table(maxn - 1, phi);    sum[0] = 0;    for(int i = 1; i < maxn; i++) sum[i] = sum[i - 1] + phi[i];    int n;    while(scanf("%d", &n) != EOF && n)    {        printf("%d\n", 2 * sum[n] - 1);    }    return 0;}
0 0
原创粉丝点击