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;
}

Description

Limak is a little polar bear. He doesn't have many toys and thus he often plays with polynomials.

He considers a polynomial valid if its degree is n and its coefficients are integers not exceeding k by the absolute value. More formally:

Let a0, a1, ..., an denote the coefficients, so . Then, a polynomial P(x) is valid if all the following conditions are satisfied:

  • ai is integer for every i;
  • |ai| ≤ k for every i;
  • an ≠ 0.

Limak has recently got a valid polynomial P with coefficients a0, a1, a2, ..., an. He noticed that P(2) ≠ 0 and he wants to change it. He is going to change one coefficient to get a valid polynomial Q of degree n that Q(2) = 0. Count the number of ways to do so. You should count two ways as a distinct if coefficients of target polynoms differ.

Input

The first line contains two integers n and k (1 ≤ n ≤ 200 000, 1 ≤ k ≤ 109) — the degree of the polynomial and the limit for absolute values of coefficients.

The second line contains n + 1 integers a0, a1, ..., an (|ai| ≤ k, an ≠ 0) — describing a valid polynomial . It's guaranteed that P(2) ≠ 0.

Output

Print the number of ways to change one coefficient to get a valid polynomial Q that Q(2) = 0.

Sample Input

Input
3 1000000000
10 -9 -3 5
Output
3
Input
3 12
10 -9 -3 5
Output
2
Input
2 20
14 -7 19
Output
0


posted @ 2016-04-06 16:46  围巾的ACM  阅读(160)  评论(0编辑  收藏  举报