题目链接:http://codeforces.com/contest/789/problem/B
题意:就是给了一个等比数列,然后给了一个l代表等比数列的项的绝对值不能大于等于这个,然后又给了m个数,表示数列里面不能出现这m个数,问在上面的条件下,等比数列最多有多少项?
解法:map映射是否出现,然后分类讨论。注意b1和q可能为0,然后再把+1,-1拿出来讨论。

//CF 789B

#include <bits/stdc++.h>
using namespace std;
const int maxn  = 1e5+10;
long long b1, q, l, m;
map <long long, int> mp;
long long a[maxn];

int main()
{
    scanf("%lld%lld%lld%lld", &b1, &q, &l, &m);
    for(int i = 1; i <= m; i++) scanf("%lld", &a[i]), mp[a[i]] = 1;
    if(b1 == 0){
        if(mp[0]) printf("0\n");
        else printf("inf\n");
    }
    else if(q == 0){
        if(abs(b1) > l) printf("0\n");
        else if(mp[b1] && mp[0]) printf("0\n");
        else if(!mp[b1]&&mp[0]) printf("1\n");
        else printf("inf\n");
    }
    else if(q == 1){
        if(abs(b1) > l || mp[b1]) printf("0\n");
        else printf("inf\n");
    }
    else if(q == -1){
        if(abs(b1) > l || (mp[b1] && mp[-b1])) printf("0\n");
        else printf("inf\n");
    }
    else{
        int ans = 0;
        long long t = b1;
        while(abs(t) <= l){
            if(mp[t] == 0) ans++;
            t = t*q;
        }
        printf("%d\n", ans);
    }
    return 0;
}