• VK Cup 2016


    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;
    }
  • 相关阅读:
    BootStrap 之 CSS全局样式中的表格
    BootStrap 之 CSS全局样式中的图片
    BootStrap 之 CSS全局样式中的按钮
    Objective-C中的消息发送总结
    Android Studio精彩案例(七)《ToolBar使用详解<一>》
    How to Change Default Web ADI Upload Parameters for FlexField Import / Validation
    iOS中的颜色
    基于OGG的Oracle与Hadoop集群准实时同步介绍
    Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
    Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5331900.html
Copyright © 2020-2023  润新知