D - Send a Table (UVA - 10820)
阿新 • • 發佈:2018-02-14
存儲 names long long ems cst int nbsp 兩個 cstring
- 題目大意
給出一個n,求從1~n中任意兩個數互質的對數為多少,(a,b)和(b,a)算兩對。
- 解題思路
構造一個歐拉函數的方法,然後用一個數組去存儲下標,因為(a,b)和(b,a)算兩對,所以每一個都加兩倍,但(1,1)很特殊,所以最後減一就行了。
- 代碼
#include<iostream> #include<cmath> #include<cstring> using namespace std; const int MAX = 600000; int phi[MAX]; void find() { memset(phi, 0, sizeof(phi)); for (int i = 1; i < MAX; i++) phi[i] = i; for (int i = 2; i < MAX; i++) { if (phi[i] == i) { for (int j = i; j < MAX; j += i) { phi[j] = phi[j] / i * (i - 1); } } } } int main() { int x; int q = 600; find(); phi[1] = 1; while (q--) { cin >> x; long long sum = 0; if (x == 0) break; for (long long i = 1; i <= x; i++) { sum += phi[i]; } cout << 2*sum-1 << endl; } return 0; }
D - Send a Table (UVA - 10820)