ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#197449 | #3449. 依存症 | Lynkcat | 100 | 10002ms | 88200kb | C++11 | 2.2kb | 2023-11-12 10:11:01 | 2023-11-12 13:16:23 |
answer
#include<bits/stdc++.h>
#define poly vector<int>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define mt make_tuple
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e18
#define mod 1000000007
#define sz(x) (int)((x).size())
// #define int ll
//#define N
using namespace std;
const int N=1000005;
int n,q,seed;
long long all;
string st;
ll spw[N],pw[N],ipw[N],sipw[N],s0[N],si0[N],s1[N],si1[N],sum0[N],sum2[N],sum3[N];
void init(){
st=' '+st;
for (int i=1;i<=n;i++)
{
spw[i]=(spw[i-1]+pw[i])%mod;
sipw[i]=(sipw[i-1]+ipw[i])%mod;
s0[i]=(s0[i-1]+(st[i]=='0')*pw[i])%mod;
s1[i]=(s1[i-1]+(st[i]=='1')*pw[i])%mod;
si0[i]=(si0[i-1]+(st[i]=='0')*ipw[i])%mod;
si1[i]=(si1[i-1]+(st[i]=='1')*ipw[i])%mod;
sum0[i]=(sum0[i-1]+(st[i]=='0')*ipw[i]%mod*s0[i-1]%mod+(st[i]=='1')*ipw[i]%mod*s1[i-1]%mod)%mod;
if (i>1)
sum2[i]=(sum2[i-1]+pw[i]%mod*sipw[i-2]%mod)%mod;
sum3[i]=sum3[i-1];
if (i+1<=n&&st[i]==st[i+1]) sum3[i]=(sum3[i]+1)%mod;
}
}
ll solve(int l,int r){
ll ans=0;
//_00_ _11_
ans=ans+(sum0[r]-sum0[l-1]+mod
-(si0[r]-si0[l-1]+mod)*s0[l-1]%mod+mod
-(si1[r]-si1[l-1]+mod)*s1[l-1]%mod+mod
)*pw[r-l]%mod;
//1__1 && 0__0 && 0__1 1__0
ll coef=(sum2[r]-sum2[l-1]+mod-(spw[r]-spw[l-1]+mod)*sipw[l-1]%mod+mod)%mod;
if (l>1) coef=(coef+pw[l]*ipw[l-1])%mod;
coef=coef*ipw[2]%mod;
ans=(ans+coef);
ans=(ans+sum3[r-1]-sum3[l-1]+mod)%mod;
return ans*((mod+1)/2)%mod;
}
void BellaKira()
{
cin>>n>>q>>seed>>st;
mt19937 myrnd(seed);
init();
// return;
for(int i=1;i<=q;i++){
int l=myrnd()%n+1,r=myrnd()%n+1;
if(l>r)
swap(l,r);
all^=1ll*i*solve(l,r);
}
cout<<all<<'\n';
}
signed main()
{
double st=clock();
pw[0]=1;
for (int i=1;i<N;i++) pw[i]=pw[i-1]*2%mod;
ipw[0]=1;
for (int i=1;i<N;i++) ipw[i]=ipw[i-1]*((mod+1)/2)%mod;
IOS;
cin.tie(0);
int T=1;
while (T--)
{
BellaKira();
}
double ed=clock();
cerr<<1.0*(ed-st)/CLOCKS_PER_SEC<<'\n';
}
/*
t0 t1
(d0+t0)
*/
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 14ms
memory: 34112kb
input:
10 10 225061887 1010000111
output:
2551
result:
ok 1 number(s): "2551"
Test #2:
score: 10
Accepted
time: 605ms
memory: 34120kb
input:
10 10000000 377962726 1110100001
output:
5319329936
result:
ok 1 number(s): "5319329936"
Test #3:
score: 10
Accepted
time: 589ms
memory: 34116kb
input:
10 10000000 294721958 0010000100
output:
14310656348
result:
ok 1 number(s): "14310656348"
Test #4:
score: 10
Accepted
time: 36ms
memory: 88196kb
input:
1000000 10 413694761 1110100011101010111100011000101110001110100001010010111011000101001011111000001...
output:
7814245032
result:
ok 1 number(s): "7814245032"
Test #5:
score: 10
Accepted
time: 34ms
memory: 88200kb
input:
1000000 10 94552888 00111101110001000000101011100001000111111101000001000111101111000110001010000101...
output:
3959639370
result:
ok 1 number(s): "3959639370"
Test #6:
score: 10
Accepted
time: 29ms
memory: 43224kb
input:
100000 100000 790695006 0101000110101000011110010101100101100000000100000001010111000000100111011011...
output:
22944277449057
result:
ok 1 number(s): "22944277449057"
Test #7:
score: 10
Accepted
time: 25ms
memory: 43228kb
input:
100000 100000 719329098 1110101100001111101010001111000000110100010001011000010001111100110010101011...
output:
80140921752825
result:
ok 1 number(s): "80140921752825"
Test #8:
score: 10
Accepted
time: 2920ms
memory: 88200kb
input:
1000000 10000000 550285156 0000000000000000000000000000000000000000000000000000000000000000000000000...
output:
112491807887012
result:
ok 1 number(s): "112491807887012"
Test #9:
score: 10
Accepted
time: 2866ms
memory: 88196kb
input:
1000000 10000000 94478736 11111001010000100001101011110100011101000100100101110001100110100101001111...
output:
15769271525357998
result:
ok 1 number(s): "15769271525357998"
Test #10:
score: 10
Accepted
time: 2884ms
memory: 88200kb
input:
1000000 10000000 561588670 1101000101110011011101000110010101101010110110100100010001010010011000101...
output:
2131628890817536
result:
ok 1 number(s): "2131628890817536"
Extra Test:
score: 0
Extra Test Passed