CodeForces - 639Cベアと多項式

件名の説明:

リマクは少しシロクマです。彼は多くのおもちゃを持っていないので、彼はしばしば、多項式を果たしています。

その程度であれば、彼は、有効な多項式を考慮Nその係数は超えない整数であり、kは絶対値で。より正式:

ましょう0、  1、...、  nは係数であるので次に、多項式Pxは、次のすべての条件が満たされた場合)が有効です。

  • 私はすべてのための整数である
  • | 私は | ≤  kのすべてのための
  • N  ≠0。

リマクは最近、有効な多項式持っているPの係数で0、  1、  2、...、  nと彼は気づいP ≠(2)0と、彼はそれを変えようとしています。彼は有効な多項式を取得するために、1つの係数を変更する予定ですQ程度のn個というQ(2)= 0がそうする方法の数をカウントします。ターゲットpolynomsの係数が異なる場合は、別々のように2つの方法をカウントする必要があります。

入力

最初の行は二つの整数含まN及びK(1≤  N  ≤200 000、1≤  K  ≤  10 ^ {9}) -多項式の次数と係数の絶対値の制限。

二行目が含まれているN  + 1つの整数0、  1、...、  nは(| I |≤  K、  N  ≠0) -有効な多項式を記述するこれは、ことが保証だP(2)≠0。

出力

有効な多項式を得るために1つの係数を変更するには、いくつかの方法を印刷QをすることをQ(2)= 0。

入力

3 1000000000
10 -9 -3 5

出力

3

入力

3 12
10 -9 -3 5

出力

2

入力

2 20
14 -7 19

出力

0

効果の件名:

あなたは、多項式Pを与える:あなたはP(2)= 0というように、(件名も制約がここで問題はおそらく意図して)多項式Pの係数を変更することができます。どのように多くの点で依頼するがありますか?

レポートの問題解決:

1:たくさん、たくさん。または削除、私はあなたの例を与えることを決め、この例を実行することにより、その見直し後に、この問題を容易にします。

2:のための試験サンプルの第2のセットを取ります。

3 12
10 -9 -3 5

そのような多項式の係数は変更しないでください:10 +( -  9)\ CDOT 2 ^ {1} +( -  3)\ CDOT 2 ^ {2} +5 \ CDOT 2 ^ {3}ステップバイステップ2 ^ {4}があります。

0 +( -  4)\ CDOT 2 ^ {1} +( -  3)\ CDOT 2 ^ {2} +5 \ 2 ^ {3} CDOT

0 + 0 +( -  5)\ CDOT 2 ^ {2} +5 \ CDOT 2 ^ {3}

0 + 0 +( -  1)\ CDOT 2 ^ {2} +3 \ CDOT 2 ^ {3}

0 + 0 +( -  1)\ CDOT 2 ^ {2} +1 \ CDOT 2 ^ {3} +1 \ cdot2 ^ {4}

係数は、処理後に得られた:00から111

                     添字:12345

3:少し考えたのは、あなたは私たちが係数インデックス4を変更すると、結果は1-3の係数に影響を与えないことを知っている、と関係なく変更が結果ではない何この時点では0です。最初の係数は(係数など)が0ではない変更することがわかりました。

4:だからのうち答えは?答えはノーです。条件の係数kの絶対値以下ではありません。今、私たちは、ステップバイステップ係数を解くことができます。

その後、直接解は確かに長い長い爆発的になります。私たちは、最初のインデックスIDX 0係数に対処することはできません。0フロントが乗算され、無視することができます。係数配列、NUMに元の係数を仮定し、修正するX、DIC治療の係数配列であり、得ることができます。X \ CDOT 2 ^ {IDX} = DIC [IDX + 1] \ CDOT 2 ^ {IDX + 1} + DIC [IDX + 2] \ cdot2 ^ {IDX + 2} + DIC [IDX + 3] \ cdot2 ^ { IDX + 3} ......

xについて解く両側を分割。この操作は、全体の両側の同等に加えて、逆方向に処理されません2 ^ {} IDX

5:接尾検出プロセスはkの裏に二回以上のものを持っており、ループの外にジャンプすることができます。

6:また、n番目の項の係数がゼロでないことに注意してください。

コード:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 200000+10;
const ll INF = 2e9+10;
ll dic[N], idx[N];
int main(){
    ll n, k, ii;
    scanf("%lld%lld", &n, &k);
    for(ll i=0; i<=n; ++i)scanf("%lld", idx+i), dic[i] = idx[i];
    for(ll i=1; i<=n+1; ++i)dic[i] += dic[i-1]/2, dic[i-1] %= 2;
    for(ll i=0; i<=n+1; ++i){
        if(dic[i]){
            ii = i;
            break;
        }
    }
    ll x = 0, ans = 0;
    for(ll i=n+1; i>=0; --i){
        x = x*2+dic[i];
        if(abs(x) > INF)break;
        if(i > ii || i == n+1 || (i == n && x == idx[i]))continue;
        if(abs(x - idx[i]) <= k)++ans;
    }
    printf("%lld\n", ans);
    return 0;
}

この問題に対する解決策は、ビット厄介を書き、あなたはまだ理解して読むことができます。

 

公開された164元の記事 ウォンの賞賛4 ビュー10000 +

おすすめ

転載: blog.csdn.net/jun_____/article/details/104108167