【NAOI】blackBOX

预估难度 水蓝

题目描述

给定无限长的,周期长度为 \(n\) 的非负整数序列 \(a\) 的前 \(n\)\(a_1,a_2,⋯ ,a_n\)

给定无限长的,周期长度为 \(m\) 的非负整数序列 \(b\) 的前 \(m\)\(b_1,b_2,⋯ ,b_m\)

给定整数 \(k\),求出:

\[\biggl(\sum^{k}_{i=1}\sum^{k}_{j=1}a_i \oplus b_j\biggr) \pmod {10^9+7}。 \]

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,mod=1e9+7,siz=64;
int n,m,k,a[N],b[N],ans,w[100];
void solve(int m){
	for(int i=1;i<=m;i++){
		for(int j=0;j<siz;j++){
			if((b[i]>>j)%2==1) w[j]=(w[j]+1)%mod;
		}
	}
}
int mak(int n){
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<siz;j++){
			if((a[i]>>j)%2==0) ans=(ans+(1ll<<j)*w[j])%mod;
			else ans=((ans+(1ll<<j)*(k-w[j])%mod)%mod+mod)%mod;
		}
	}
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	if(k>=m){
		solve(m);
		if(k>=m*2ll){
			for(int i=0;i<siz;i++){
			    w[i]=(w[i]*(k/m)%mod+mod)%mod;
		    }
	    }
	}
	solve(k%m);
	if(k>=n){
		ans=mak(n);
		if(k>=n*2ll) ans=(ans*(k/n))%mod;
	}
	ans=(ans+mak(k%n))%mod;
	cout<<ans;
	return 0;
}
posted @ 2025-07-16 14:49  NeeDna  阅读(10)  评论(0)    收藏  举报