a.水
b.水的我想吐,奈何英文渣读题读半天还读错了(所以所最讨厌模拟了就以因为读不懂题啊O(≧口≦)O)。
c.水枚举。
d.水博弈单数前走一步后每步模仿对手走。
e.我就没资格说水了,因为我也是看结题报告才懂的。。
就酱。 P(x) = a0 + a1x1 + ... + anxn.缩减式子可得(P(x) -a0)/x得到以a1开头的新式子(由于ax不知道所以随便了对不对O(∩_∩)O~~)
两式子都酱一步一步递归缩减,最终y1||y2==0时说明式子到头了,然后有可能超时的地方就是枚举a0的时候a0可能过小导致枚举过多,这时候如果(x2>x1)就swap能避免tle。
详情见http://hzwer.com/5390.html

#include<string.h> #include<stdio.h> #include<iostream> using namespace std; long long ans; void sum(long long x1, long long y1, long long x2, long long y2){ if(y1 == 0 || y2 == 0){ if(y2 == 0 && y1 == 0) ans++; return ; } if(x2 > x1){ swap(x1, x2); swap(y1, y2); } long long a = y1%x1; for(long long i = 0; ; i++){ long long a0 = i*x1+a;//printf("*%lld ", a0); if(a0 > y1 || a0 > y2)break; if((y2-a0)%x2 == 0){ sum(x1, (y1-a0)/x1, x2, (y2-a0)/x2); } } } int main(){ long long t, a, b; cin>>t>>a>>b; if(a == 1 && b == 1 && t == 1){ printf("inf "); }else if(t == a && a != b){ printf("0 "); }else{ sum(t, a, a, b); cout<<ans<<endl; } }