1005
typedef long long LL ; const LL mod = 1000000007LL ; const int maxn = 1<<11 ; LL dp[1002][maxn] , dp1[1002][maxn] , dp2[1002][maxn] ; int a[1002] ; int main(){ int n , i , j , t , c ; cin>>t ; while(t--){ cin>>n ; for(i = 1 ; i <= n ; i++) scanf("%d" , &a[i]) ; memset(dp , 0 , sizeof(dp)) ; memset(dp1, 0 , sizeof(dp1)) ; for(i = 1 ; i <= n ; i++){ for(j = 0 ; j < maxn ; j++) dp1[i][j] = dp1[i-1][j] ; for(j = 0 ; j < maxn ; j++){ c = j ^ a[i] ; dp1[i][c] += dp1[i-1][j] ; if(dp1[i][c] >= mod) dp1[i][c] %= mod ; } dp1[i][a[i]]++ ; for(j = 0 ; j < maxn ; j++){ c = j ^ a[i] ; dp[i][c] += dp1[i-1][j] ; if(dp[i][c] >= mod) dp[i][c] %= mod ; } dp[i][a[i]]++ ; } memset(dp2 , 0 , sizeof(dp2)) ; for(i = n ; i >= 1 ; i--){ for(j = 0 ; j < maxn ; j++) dp2[i][j] = dp2[i+1][j] ; for(j = 0 ; j < maxn ; j++){ c = j & a[i] ; dp2[i][c] += dp2[i+1][j] ; if(dp2[i][c] >= mod) dp2[i][c] %= mod ; } dp2[i][a[i]]++ ; } LL sum = 0LL , s ; for(i = 1 ; i <= n ; i++){ for(j = 0 ; j < maxn ; j++){ s = dp[i][j] * dp2[i+1][j] ; if(s >= mod) s %= mod ; sum += s ; if(sum >= mod) sum %= mod; } } printf("%I64d\n" , sum) ; } return 0 ; }
int gcd(int x , int y){ return y == 0 ? x : gcd(y , x % y) ; } const int maxn = 100008 ; int color[maxn<<2] ; int x[maxn] ; void up(int t){ if(color[t<<1] == color[t<<1|1]) color[t] = color[t<<1] ; else color[t] = -1 ; } void down(int t){ if(color[t] != -1){ color[t<<1] = color[t<<1|1] = color[t] ; color[t] = -1 ; } } void make(int l , int r , int t){ if(l == r){ color[t] = x[l] ; return ; } int m = (l + r) >> 1 ; make(l , m , t<<1) ; make(m+1 , r , t<<1|1) ; up(t) ; } void update(int L , int R , int c , int l , int r , int t){ if(L <= l && r <= R || l == r){ color[t] = c ; return ; } down(t) ; int m = (l + r) >> 1 ; if(L <= m) update(L , R , c , l , m , t<<1) ; if(R > m) update(L , R , c , m+1 , r , t<<1|1) ; up(t) ; } void update2(int L , int R , int c , int l , int r , int t){ if(l == r && color[t] > c){ color[t] = gcd(color[t] , c) ; return ; } if(L <= l && r <= R){ if(color[t] != -1){ if(color[t] > c) color[t] = gcd(color[t] , c) ; return ; } else{ int m = (l + r) >> 1 ; if(L <= m) update2(L , R , c , l , m , t<<1) ; if(R > m) update2(L , R , c , m+1 , r , t<<1|1) ; up(t) ; } return ; } down(t) ; int m = (l + r) >> 1 ; if(L <= m) update2(L , R , c , l , m , t<<1) ; if(R > m) update2(L , R , c , m+1 , r , t<<1|1) ; up(t) ; } void ask(int l , int r , int t){ if(color[t] != -1){ for(int i = l ; i <= r ; i++) x[i] = color[t] ; return ; } down(t) ; int m = (l + r) >> 1 ; ask(l , m , t<<1) ; ask(m+1 , r , t<<1|1) ; } int main(){ int t , n , i , m , k , l , r , c ; cin>>t ; while(t--){ cin>>n ; for(i = 1 ; i <= n ; i++) scanf("%d" , &x[i]) ; make(1 , n , 1) ; cin>>m ; while(m--){ scanf("%d%d%d%d" , &k,&l,&r,&c) ; if(l > r) swap(l , r) ; if(k == 1) update(l , r , c , 1 , n , 1 ) ; else update2(l , r , c , 1 , n , 1 ) ; } ask(1 , n , 1) ; for(i = 1 ; i <= n ; i++) printf("%d " , x[i]) ; puts("") ; } return 0 ; }
1010
typedef long long LL ; const LL mod = 1000000007LL ; const int maxn = 1<<20 + 1 ; LL dp[maxn] ; int main(){ int t , n , k , l , i , j , limt ; cin>>t ; while(t--){ scanf("%d%d%d" , &n , &k , &l) ; LL c = 0LL ; limt = (1<<k) - 1 ; if(l > k){ c = (LL)(l - k) ; l = k ; } memset(dp , 0 , sizeof(dp)) ; dp[0] = 1LL ; while(n--){ for(i = limt ; i >= 0 ; i--){ if(! dp[i]) continue ; int from = dp[i] ; LL next = dp[i] * c % mod ; for(j = 1 ; j <= l ; j++){ //每种可能状态都加上j i左移j位,超出的变0, 再在(j-1)为加1 //不选择 j , 状态就是 i //转移状态就是这2种情况 int to = i | (1<<(j-1)) | ((i<<j) & limt) ; dp[to] += from ; if(dp[to] >= mod) dp[to] %= mod ; } //加(k , L] 的情况,状态不会改变,如果选择此数组成方案多next dp[i] += next ; if(dp[i] >= mod) dp[i] %= mod ; } } LL sum = 0 ; for(i = 0 ; i <= limt ; i++){ if(i & (1<<(k-1))){ sum += dp[i] ; if(sum >= mod) sum %= mod; } } printf("%I64d\n" , sum) ; } return 0 ; }