Codeforces Round #281 (Div. 2) E

2014/12/6

好好寫一次。

因爲學的很透徹。。因爲學的很艱難。。因爲這道題目我不會,是因爲我丟掉了以前高中,初中時代那種思維。

現在只會看片玩遊戲。腦子真的變笨了。


如題目要求

a0+a1t+a2t^2+...=a
a0+a1a+a2a^2+...=b

移項得
a1+a2t + a3t^2+...  =(a-a0)/t
a1+a2a + a3a^2+...=(b-a0) /a

(a-a0) %t ==0   a0 = A%t;  a0 <= b,a0<= a 
(b-a0)%a==0     a0 = B%a;

設 (a-a0)/t 爲A ,(b-a0)/a 爲 B  。當 A== B時滿足條件。即有ai滿足兩式均成立。

那麼下一個遞推式 : a2 + a3t + a4t^2 + ..... =     (A- a1)/t;

                                      a2 + a3ta+ a4a^2 + ..... =  (B- a1)/t;

根據兩個等式我們可知 

如果兩式求出的ai不相等...並且都不爲零,那麼可知滿足這兩個等式成立的條件不存在。即不符合題意。則不存在 f(t)=a,f(a)=b;

還有種情況,就是兩式求出ai 不相等,但是至少有一個爲0,這種情況下你不能判斷它無解,需要繼續遞歸下去。原因:

(A-ai) %t ==0   ai = A%t;      if'(A%t  == 0&& ai = t) 從 ai = A%t 得出 ai =0; 
(B-ai)%a==0     ai = B%a;        而由ai = B%a 得出ai = t;要避免把這種情況也判做無解的處境。     


這樣子還不夠,當 t等於1的時候,任何數 % 1 == 0.這種情況需要特判下。官方題解說明的這種情況官方題解


 #include<stdio.h>
 #include<string.h>
 #define inf  0xff 
 
 int find(__int64 t,__int64 a, __int64 A,__int64 B)
 {
 	if(A == B)return 1;
 	__int64 a0;
 	__int64 ra ,rb;
 	ra = A%t;
 	rb = B%a;
 	if(ra != rb&&rb != 0&&ra != 0)return 0;
	  a0 = ra==0?rb:ra;
     return find(t,a,(A-a0)/t,(B-a0)/a);
 }
 
 
 int main()
 {
 	int n;
 	__int64 t,a,b;
 	while(~scanf("%I64d%I64d%I64d",&t,&a,&b))
 	{
	 	 int ans = 0;
         if(a == t&&a == b)
 	     {
             if(a == 1)ans=inf;
             else ans=2;
         }
         if(a != t&&(a-b)%(t-a)==0&&(a-b)/(t-a)>=0&&find(t,a,a,b))ans = 1;
         if(ans == inf)printf("inf\n");
         else printf("%d\n",ans);
         
	 }
	 return 0;
 }

第二種方法:

(A-ai)%t==0 ,(B-ai)%a==0.

ai = ai%A = B%a;

如此可求得 ai = B%a;然後反推證明滿足條件的ai是否存在: if(ai != 0 && ( A - ai)%t  ) return 0;

(當然,前面說過,你要避免a0 = a, ai = B%a 算出來ai是0的情況判做無解的處境)

 #include<stdio.h>
 #include<string.h>
 #define inf  0xff 
 
 int find(__int64 t,__int64 a, __int64 A,__int64 B)
 {
 	if(A == B)return 1;
 	__int64 a0;
	  a0 = B%a;
    if(a0%t !=0 && a0%t != A%t)return 0;
    
	 return find(t,a,(A-a0)/t,(B-a0)/a);
 }
 
 
 int main()
 {
 	int n;
 	__int64 t,a,b;
 	while(~scanf("%I64d%I64d%I64d",&t,&a,&b))
 	{
	 	 int ans = 0;
         if(a == t&&a == b)
 	     {
             if(a == 1)ans=inf;
             else ans=2;
         }
         
         if(a != t&&(a-b)%(t-a)==0&&(a-b)/(t-a)>=0&&find(t,a,a,b))ans = 1;
         
         
         if(ans == inf)printf("inf\n");
         else printf("%d\n",ans);
         
	 }
	 return 0;
 }




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