이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cassert>
#include <bitset>
using namespace std;
typedef long long ll;
const int maxn=1005, mod=1e9+7, maxq=1e5+5, Log=7;
inline int sum(int a, int b){
if(a+b>=mod){
return a+b-mod;
}
if(a+b<0){
return a+b+mod;
}
return a+b;
}
inline int mul(int a, int b){
return (ll)a*b%mod;
}
int n, m;
int a[maxn];
int sol;
int q[maxq][3];
int komb[maxn][maxn][Log][Log][2][2];
void precompute(){
bool p1, p2;
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
for(int k=0; k<Log; k++){
for(int l=0; l<Log; l++){
p1=a[i]&(1<<k);
p2=a[j]&(1<<l);
komb[i][j][k][l][p1][p2]=1;
}
}
}
}
for(int qq=0; qq<m; qq++){
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
for(int k=0; k<Log; k++){
for(int l=0; l<Log; l++){
if(q[qq][0]<=i && q[qq][1]>=i && q[qq][0]<=j && q[qq][1]>=j && (1<<k)&q[qq][2] && (1<<l)&q[qq][2]){
komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][1][1]);
komb[i][j][k][l][0][1]=sum(komb[i][j][k][l][0][1], komb[i][j][k][l][1][0]);
komb[i][j][k][l][1][0]=komb[i][j][k][l][0][1];
komb[i][j][k][l][1][1]=komb[i][j][k][l][0][0];
}
else if(q[qq][0]<=i && q[qq][1]>=i && (1<<k)&q[qq][2]){
komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][1][0]);
komb[i][j][k][l][0][1]=sum(komb[i][j][k][l][0][1], komb[i][j][k][l][1][1]);
komb[i][j][k][l][1][0]=komb[i][j][k][l][0][0];
komb[i][j][k][l][1][1]=komb[i][j][k][l][0][1];
}
else if(q[qq][0]<=j && q[qq][1]>=j && (1<<l)&q[qq][2]){
komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][0][1]);
komb[i][j][k][l][0][1]=komb[i][j][k][l][0][0];
komb[i][j][k][l][1][0]=sum(komb[i][j][k][l][1][0], komb[i][j][k][l][1][1]);
komb[i][j][k][l][1][1]=komb[i][j][k][l][1][0];
}
else{
komb[i][j][k][l][0][0]=mul(komb[i][j][k][l][0][0], 2);
komb[i][j][k][l][0][1]=mul(komb[i][j][k][l][0][1], 2);
komb[i][j][k][l][1][0]=mul(komb[i][j][k][l][1][0], 2);
komb[i][j][k][l][1][1]=mul(komb[i][j][k][l][1][1], 2);
}
}
}
}
}
}
}
void rijesi(){
int kofa;
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
if(i!=j){
kofa=2*(i+1)*(n-j);
}
else{
kofa=(i+1)*(n-j);
}
for(int k=0; k<Log; k++){
for(int l=0; l<Log; l++){
sol=sum(sol, mul(mul(1<<(k+l), kofa), komb[i][j][k][l][1][1]));
}
}
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i=0; i<n; i++){
cin >> a[i];
}
cin >> m;
for(int i=0; i<m; i++){
cin >> q[i][0] >> q[i][1] >> q[i][2];
q[i][0]--;
q[i][1]--;
}
precompute();
/* for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
for(int k=0; k<2; k++){
for(int l=0; l<2; l++){
cout << komb[i][j][k][l][1][1] << ' ';
}
cout << '\n';
}
cout << '\n';
}
cout << '\n';
}*/
rijesi();
cout << sol << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |