一開始題意就沒搞懂,花費挺長時間去理解題意
查詢了下其他人的解題報告,明白了實際上就是求一個size * size 大小的矩陣的互素的個數。
數論的歐拉函數沒有太理解,好像以前上課講過,不記得了。
自己寫了下題目,樣例都出來了,但是超時, 不理解哪裏錯了,大家幫忙看下我在那裏出了問題。
#include <stdio.h>
int GCD (int m, int n)
{
if (n == 0)
return m;
else
return GCD(n, m % n);
}
int main()
{
int T, size, i, j, k, count, temp;
scanf("%d", &T);
for (k = 1; k <= T; k++)
{
scanf("%d", &size);
count = 0;
for (i = 1; i <= size; i++)
for (j = 1; j < i; j++)
if (GCD(i, j) == 1)
count++;
count = count * 2 + 3;
printf("%d %d %d\n", k, size, count);
}
return 0;
}
我看網上其他牛人都是預處理所有狀況,然後再輸入數據進行查詢輸出。
不知道爲什麼我輸入數據後在處理爲什麼會超時。
請各位牛人幫我解答下。。
這是我理解後重寫的代碼AC了,但是時間好慢94ms
#include <stdio.h> //求最大公約數 //惡補公式 //GCD(a, b) = GCD(b, a % b); //GCD(a, 0) = |a|; //GCD(a, b) = GCD(b, a); int GCD (int m, int n) { if (n == 0) return m; else return GCD(n, m % n); } int table[1010][1010], sum[1010]; int main() { int T, size, i, j, k, count, temp; //初始化表,關於角平分線對稱, 只求一半即可 for (i = 1; i < 1010; i++) for (j = 1; j < i; j++) if (GCD(i, j) == 1) table[i][j] = 1; //軸上,角平分線上,單獨考慮。 //其實可以不寫 table[0][1] = table[1][0] = table[1][1] = 1; //這句話完全代替了 sum[1] = 3; for (i = 2; i < 1010; i++) { temp = 0; for (j = 1; j <= i; j++) temp += table[i][j]; sum[i] = temp * 2 + sum[i-1]; } scanf("%d", &T); for (k = 1; k <= T; k++) { scanf("%d", &size); printf("%d %d %d\n", k, size, sum[size]); } return 0; }