hdu 1005解題報告

這道題目n的取值範圍很大,1 <= n <= 100,000,000。因此肯定是需要優化才能AC。

首先我考慮到時是有沒有通項公式,研究了一下,沒發現什麼東西,突然看到兩個1時就想到會不會在數組中有循環,然後當下次連續出現兩個1時即爲一次循環。這時我們就只需計算一個循環週期就可以了。另外,讓我更堅定有循環的是公式有個取模運算,因而肯定有一個循環。知道這個思路後代碼就簡單了。

不過讓我感到詭異是在尋找數組規律裏的那個循環中,循環的限制條件中我沒寫,結果直接WA了,然後一直不解,於是加了個i<51試了下AC了。

考慮到f[i]的取值只能在0~6之間。因而,f[i],f[i-1]只有7*7=49種可能的組合,剛開始我並不能確定下一個循環一定會出現1,1.但是後來想了一下,如果有循環的話,1,1肯定會繼續出現的,如果不出現就不能算是有循環。因而如有循環1,1肯定會再次出現。


#include <stdio.h>

int main()
{
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	long n;
	int a,b,i;
	int f[51];
	while(scanf("%d %d %ld",&a,&b,&n)==3)
	{
		if(0 ==a && 0 == b && 0 ==n)
			break;
		f[1] = 1;
		f[2] = 1;
		for(i=3;i<51;i++)
		{
			f[i] = (a*f[i-1]+b*f[i-2])%7;
			
			if(f[i]==1 && f[i-1]==1)
			{
				break;
			}
			
		}
		int ans = n%(i-2);
		if(ans == 0)
		{
			printf("%d\n",f[i-2]);
		}
		else
		{
			printf("%d\n",f[ans]);
		}
	}
	
	return 0;
}


發佈了33 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章