CF 789B Masha and geometric depression, map

题目链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值