POJ 3090簡單數論

一開始題意就沒搞懂,花費挺長時間去理解題意

查詢了下其他人的解題報告,明白了實際上就是求一個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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章