VK Cup 2016 - Round 1 (Div. 2 Edition) D. Bear and Polynomials

D. Bear and Polynomials

题目连接:

http://www.codeforces.com/contest/658/problem/D

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

3 1000000000
10 -9 -3 5

Sample Output

3

Hint

题意

给你一个多项式,然后告诉你P(2)!=0

你可以改变其中某一项的系数,使得P(2)=0,问你有多少种改变方法

题解:

先正面扫一遍,把所有的系数都往后传,这样除了最后一个数的系数以外,其他的系数都是+-1,0这种

然后我们再倒着扫一遍,判断这个数的系数应该是多少就好了。

对了,在从后面往前面走的过程中,如果某个位置的数大于了某个值的时候,就可以直接break了

因为会在不断的乘以2,不可能产生答案了。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+6;

long long a[maxn];
long long c[maxn];
int n,flag;
long long 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;
        }
    long long sum = 0;
    long long ans = 0;
    for(int i=n;i>=0;i--)
    {
        sum = sum * 2LL + a[i];
        if(abs(sum)>1ll*1e9*1e7)break;
        if(i<=flag)
        {
            long long p = c[i]-sum;
            if(abs(p)<=k)
            {
                if(i==n&&p==0)continue;
                ans++;
            }
        }
    }
    cout<<ans<<endl;
}
    原文作者:qscqesze
    原文地址: https://www.cnblogs.com/qscqesze/p/5331900.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞