Codeforces Round #281 (Div. 2)

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;
    }
}
View Code
原文地址:https://www.cnblogs.com/icodefive/p/4249645.html