题意:给一个多项式,然后告诉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;
}