题目链接: http://codeforces.com/contest/789/problem/B
题目描述: 大概是给首项b1和公比q,数列中的数的绝对值不能超过 l,和不好的数的个数 m,不好的数定义为:不是数列中的数,让你求出最后形成的数列最多有多少个(在形成数列的时候,如果出现了不好的数,不能加入数列,继续向下执行
解题思路: 只需要讨论b1 q 分别为0, 1, -1 的情况就可以, 是一道比较简单的题, 但是我傻逼的没有读明白题, 题目说如果遇到大于l就停止了, 但是我以为不停止, 我还以为自己有那个地方出错了, 然后就一直在调试代码, 在寻找错误, 其实根本没有错误, 就是我的题意理解错了, 赛后看数据还是不明白自己哪里错了, 就是这样自己也不去读题我也是醉了, 自己为什么这么固执啊......
代码:
#include <iostream> #include <cstdio> #include <map> #include <iterator> #include <string> #include <algorithm> #include <vector> #include <cmath> #include <cstring> using namespace std; typedef long long ll; map<ll, ll> bad; ll b1, q, l, m; int main() { scanf( "%lld%lld%lld%lld", &b1, &q, &l, &m ); for( ll i = 1; i <= m; i++ ) { ll num; scanf( "%lld", &num ); bad[num] = 1; } if( q == 1 || q == -1 ) { if( q == 1 ) { if( bad[b1] || abs(b1) > l ) { printf( "0\n" ); } else { printf( "inf\n" ); } } else { if( (bad[b1] && bad[-b1]) || abs(b1) > l ) { printf( "0\n" ); } else { printf( "inf\n" ); } } return 0; } if( b1 == 0 ) { if( bad[b1] ) { printf( "0\n" ); } else { printf( "inf\n" ); } return 0; } if( q == 0 ) { if( (bad[0]&&bad[b1]) || abs(b1) > l ) { printf( "0\n" ); } else if( !bad[b1] && bad[0] ) { printf( "1\n" ); } else { printf( "inf\n" ); } return 0; } ll t = (ll)b1; ll ans = 0; while( abs(t) <= (ll)l ) { if( !bad[t] ) ans ++; t = t * q; } printf( "%lld\n", ans ); return 0; }
思考: 马上就区域赛了自己还是这么马虎, 自己这一年的努力白费了? 是白费了吗? 如果不想白费的话可再努力一点, 可以再认真一点可以吗? 谢谢, 别辜负自己.....然后好好学习数学啊, 机器学习的底子就是数学, 自己的视野一定要提升, 要不然真对不起自己每天泡图书馆, 每天回寝室还学, 和每天玩游戏还有什么区别, 专心一点, 认真一点好吗