UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#197449#3449. 依存症Lynkcat10010002ms88200kbC++112.2kb2023-11-12 10:11:012023-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) 
*/

Details

小提示:点击横条可展开更详细的信息

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