3 5 13 25仔細看圖可以發現:對於每一行都可以看成是關於1/1對稱的兩部分,所以只需求出1/1左邊的個數就可求出這一行的個數。而左邊全部都是真分數,分母為x的真分數的個數就是x的歐拉函數值。n最大為1000000,所以可以遞推打表。
#includeconst int N = 1000001; int e[N]; __int64 a[N], res = 0; void euler() { for(int i = 2; i < N; i++) e[i] = 0; e[1] = 1; for(int i = 2; i < N; i++) if(!e[i]) { for(int j = i; j < N; j += i) { if(!e[j]) e[j] = j; e[j] = e[j] / i * (i-1); } } } int main() { int i, n; euler(); for(i = 1; i < N; i++) { res += e[i]; a[i] = res * 2 + 1; } while(~scanf("%d", &n)) printf("%I64d\n", a[n]); return 0; }