CodeForces 658D Bear and Polynomials
题意:给一个多项式,然后告诉P(2)!=0,改变其中某一项的系数,使得P(2)=0,问你有多少种改变方法
思路:先正面扫一遍,把所有的系数都往后传,这样除了最后一个数的系数以外,其他的系数都是+-1,0这种然后我们再倒着扫一遍,判断这个数的系数应该是多少就好了。在从后面往前面走的过程中,如果某个位置的数大于了某个值的时候,就可以直接break了,因为会在不断的乘以2,不可能产生答案了。
#include <cstdio> #include <queue> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> #include <vector> #include <map> #include <string> #include <set> #include <ctime> #include <cmath> #include <cctype> using namespace std; #define maxn 200000+100 #define LL long long int cas=1,T; LL a[maxn],c[maxn]; int n,flag; LL k; int main() { scanf("%d%lld",&n,&k); for (int i = 0;i<=n;i++) { scanf("%lld",&a[i]); c[i]=a[i]; } for (int i = 0;i<n;i++) { a[i+1]+=a[i]/2LL; a[i]%=2LL; } for (int i = 0;i<=n;i++) { if (a[i]) { flag=i; break; } } LL sum = 0; LL ans = 0; for (int i = n;i>=0;i--) { sum = sum*2LL+a[i]; if (abs(sum) > 1LL*1e9*1e9) break; if (i<=flag) { LL p = c[i]-sum; if (abs(p)<=k) { if (i==n && p==0) continue; ans++; } } } printf("%lld\n",ans); //freopen("in","r",stdin); //scanf("%d",&T); //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); return 0; }