CodeForces 657B Bear and Polynomials

题目链接:http://codeforces.com/problemset/problem/657/B


Bear and Polynomials

time limit per test :2 seconds
memory limit per test :256 megabytes
input: standard input
output: standard output

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 exceedingk by the absolute value. More formally:

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

  • ai is integer for everyi;
  • |ai| ≤ k for everyi;
  • 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 avalid polynomial Q of degreen 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 integersa0, 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 polynomialQ that Q(2) = 0.

Examples

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

Note

In the first sample, we are given a polynomial P(x) = 10 - 9x - 3x2 + 5x3.

Limak can change one coefficient in three ways:

  1. He can set a0 =  - 10. Then he would getQ(x) =  - 10 - 9x - 3x2 + 5x3 and indeedQ(2) =  - 10 - 18 - 12 + 40 = 0.
  2. Or he can set a2 =  - 8. ThenQ(x) = 10 - 9x - 8x2 + 5x3 and indeedQ(2) = 10 - 18 - 32 + 40 = 0.
  3. Or he can set a1 =  - 19. ThenQ(x) = 10 - 19x - 3x2 + 5x3 and indeedQ(2) = 10 - 38 - 12 + 40 = 0.

In the second sample, we are given the same polynomial. This time though,k is equal to 12 instead of109. Two first of ways listed above are still valid but in the third way we would get|a1| > k what is not allowed. Thus, the answer is2 this time.


思路:既然让x等于2,那就好办了。像处理二进制一样,将所有系数变换到最高项系数那里。然后从最高项系数开始,按权求和,一直到不大于第一个系数不为0的项再进行判断。为什么呢?因为如果在其之后,将它的系数往最高项移动,对低项没影响,而低项有不为0的项,这样是无解的。


直接附上AC代码:

#include 
using namespace std;
typedef long long ll;
const int maxn = 200005;
ll num[maxn], t[maxn];
int n, k;

int main(){
    #ifdef LOCAL
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    #endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    for (int i=0; i<=n; ++i){
        cin >> num[i];
        t[i] = num[i];
    }
    for (int i=1; i<=n; ++i){           // 低项系数高项移
        num[i] += num[i-1]/2ll;
        num[i-1] %= 2ll;
    }
    int flag = 0;
    for (int i=0; i<=n; ++i)            // 找移动之后的第一个不为零的项
        if (num[i] != 0ll){
            flag = i;
            break;
        }
    ll sum = 0ll;
    int ans = 0;
    for (int i=n; i>=0; --i){
        sum = sum*2ll+num[i];           // 按权求和
        if (abs(sum) > 2e9)             // 已经不满足系数绝对值条件,再往前更加不满足
            break;
        if (i <= flag){
            ll temp = abs(sum-t[i]);
            if (i==n && temp==0ll)      // 满足此条件,说明要使最高项系数为0,不可取
                continue;
            if (temp <= k)
                ++ans;
        }
    }
    cout << ans << endl;
    return 0;
}


你可能感兴趣的:(数学)