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;
}