uva10820(數論 +尤拉函式)
阿新 • • 發佈:2019-02-13
題意:
給出n,算出小於等於n的所有數中,有幾對互質;
思路:
尤拉函式:尤拉函式的原理是,把n所有的因子的倍數全部去掉;
例如12的因子有2,3,4,6;就把12以下2,3,4,6的倍數全部減掉,剩下的就是和12互質的數.
尤拉函式是算小於n的數中,有幾個數和n互質.
然後把1到n的所有尤拉函式的值累加起來就行了.
#include<cstdio> #include<cstring> #include<cmath> const int N = 50005; int prime[N]; int n; void solve() { prime[1] = 1; for(int i = 2 ; i <= N ;i++) { if(!prime[i]) { for(int j = i ; j <= N ; j += i) { if(!prime[j]) prime[j] = j; prime[j] = prime[j] / i * (i - 1); } } } for(int i = 2 ; i <= N ;i++) { prime[i] += prime[i - 1]; } } int main () { solve(); while(scanf("%d",&n) && n) { printf("%d\n",prime[n] * 2 - 1); } }