CF w2d1 C. Banh-mi

JATCはBanh-mi(ベトナム料理)が大好きです。彼のバンミへの愛情はあまりにも大きいので、彼はいつも朝食にそれを持っています。今朝、いつものように、彼はBanh-miを購入し、特別な方法で楽しむことにしました。

まず、Banh-miをn個の部分に分割し、それらを1行に配置して、1からnまで番号を付けます。各部分iについて、彼は部分の美味しさをxi∈{0,1}と定義します。JATCはこれらのパーツを一つずつ食べていきます。各ステップで、彼は任意の残りの部分を選択してそれを食べます。一部がi番目の部分であるとすると、彼のBanh-miの楽しみはxiによって増加し、残りのすべての部分の美味しさもxiによって増加します。JATCの最初の楽しみは0です。

たとえば、3つの部分の美味しさが[0,1,0]であるとします。JATCが2番目の部分を食べると、楽しみが1になり、残りの部分の美味しさが[1、、1]になります。次に、彼が最初の部分を食べると、彼の楽しみは2になり、残りの部分は[、_、2]になります。最後の部分を食べた後、JATCの楽しみは4になります。

ただし、JATCはすべての部品を食べるのではなく、後で使用するために一部を保存することを望んでいます。彼はqクエリを提供し、クエリはそれぞれ2つの整数liとriで構成されます。クエリごとに、ある範囲の[li、ri]の範囲のインデックスを持つすべての部分を一定の順序で食べた場合に得られる最大の楽しみを彼に知らせる必要があります。

すべてのクエリは互いに独立しています。クエリに対する答えは非常に大きくなる可能性があるため、10 ^ 9 + 7を法として出力します。

入力

最初の行には、2つの整数nとq(1≤n、q≤100000)が含まれています。

2行目にはn文字の文字列が含まれ、各文字は「0」または「1」のいずれかです。i番目の文字は、i番目の部分の美味しさを定義します。

次の各q行には、2つの整数liおよびri(1≤li≤ri≤n)、つまり対応するクエリのセグメントが含まれています。

出力

q行を出力します。i行目は単一の整数を含みます— 109 + 7を法とするi番目のクエリに対する答え。

inputCopy
4 2
1011
1 4
3 4
outputCopy
14
3
inputCopy
3 2
111
1 2
3 3
outputCopy
3
1

注意

最初の例では:

クエリ1の場合:JATCがこれらの部分を食べるための最良の方法の1つは、1、4、3、2です。
クエリ2の場合:3、4、4、3の両方の順序で同じ答えが得られます。
2番目の例では、パーツを食べる順序は同じ答えになります。

#include<bits/stdc++.h>
const int mod=1e9+7,maxn=1e6+5;
using namespace std;
int main()
{
	int n,q,pre[100005]={0},power[300005]={1};
	string s;
	cin>>n>>q>>s;
	for(int i=1;i<=n;i++)pre[i]=pre[i-1]+s[i-1]-'0';
	for(int i=1;i<=3*n;i++)power[i]=power[i-1]*2%mod;
	while(q--){
		int l,r;
		cin>>l>>r;
		l--;r--;
		int a=pre[r+1]-pre[l];
		int b=r+1-l-a;
		//cout<<power[a]<<endl;
		cout << ((power[a+b]-power[b])%mod+mod)%mod<<endl;
	}
	return 0;
}

おすすめ

転載: www.cnblogs.com/LiangYC1021/p/12716545.html