件名の説明:
リマクは少しシロクマです。彼は多くのおもちゃを持っていないので、彼はしばしば、多項式を果たしています。
その程度であれば、彼は、有効な多項式を考慮Nその係数は超えない整数であり、kは絶対値で。より正式:
ましょう0、 1、...、 nは係数であるので。次に、多項式P(xは、次のすべての条件が満たされた場合)が有効です。
- 私はすべてのための整数である私。
- | 私は | ≤ 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 ≤ ) -多項式の次数と係数の絶対値の制限。
二行目が含まれている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
そのような多項式の係数は変更しないでください:。ステップバイステップがあります。
係数は、処理後に得られた:00から111
添字:12345
3:少し考えたのは、あなたは私たちが係数インデックス4を変更すると、結果は1-3の係数に影響を与えないことを知っている、と関係なく変更が結果ではない何この時点では0です。最初の係数は(係数など)が0ではない変更することがわかりました。
4:だからのうち答えは?答えはノーです。条件の係数kの絶対値以下ではありません。今、私たちは、ステップバイステップ係数を解くことができます。
その後、直接解は確かに長い長い爆発的になります。私たちは、最初のインデックスIDX 0係数に対処することはできません。0フロントが乗算され、無視することができます。係数配列、NUMに元の係数を仮定し、修正するX、DIC治療の係数配列であり、得ることができます。
xについて解く両側を分割。この操作は、全体の両側の同等に加えて、逆方向に処理されません。
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;
}
この問題に対する解決策は、ビット厄介を書き、あなたはまだ理解して読むことができます。