B
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<bitset>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define endl '\n'
const double pi = acos(-1);
const int maxn = 1e5 + 10;
const int maxm = 1200;
const ll mod = 1e9 + 7;
int t, block;
int belong[maxn];
ll ans, temp;
ll fact[maxn], Ans[maxn], inv[maxn];
struct node{
int l, r, id;
}q[maxn];
bool cmp(node a,node b){
return (a.r/block)==(b.r/block)?a.l<b.l:a.r<b.r;
}
ll ksm(ll a, ll b){
ll ans = 1, base = a % mod;
while(b){
if(b & 1) ans = (ans * base) % mod;
base = (base * base) % mod;
b >>= 1;
}
return ans % mod;
}
ll C(int n,int k)
{
return fact[n]*inv[k]%mod*inv[n-k]%mod;
}
void addn(int l,int r)
{
ans = (2*ans%mod - C(l-1,r)+mod)%mod;
}
void addm(int l,int r)
{
ans = (ans+C(l,r))%mod;
}
void deln(int l,int r)
{
ans = (ans+C(l-1,r))%mod *temp %mod;
}
void delm(int l,int r)
{
ans = (ans-C(l,r)+mod)%mod;
}
int main(){
scanf("%d", &t);
for(int i = 1 ; i <= t ; ++ i){
scanf("%d %d", &q[i].l, &q[i].r);
q[i].id = i;
}
int n = 100000;
block=sqrt(n);
fact[0] = 1;
for(int i=1;i<=n;i++)
{
fact[i] = (fact[i-1] * i) % mod;
belong[i]=(i-1)/block+1;
}
inv[n-1]=ksm(fact[n-1],mod-2);
for(int i=n-2 ; i>=0 ; i--) inv[i] = inv[i+1]*(i+1) % mod;
temp = ksm(2, mod-2);
sort(q+1,q+1+t,cmp);
int l = 5;
int r = 2;
ans = 16;
for(int i = 1 ; i <= t ; ++ i){
while(l<q[i].l) addn(++l,r);
while(r<q[i].r) addm(l,++r);
while(l>q[i].l) deln(l--,r);
while(r>q[i].r) delm(l,r--);
Ans[q[i].id] = ans;
}
for(int i = 1 ; i <= t ; ++ i)
cout << Ans[i] << endl;
return 0;
}
D
#include<bits\stdc++.h>
using namespace std;
const int maxn = 1e6+7;
#define ll long long
ll a[maxn];
int n,m;
int main(){
int t,x,y;
scanf("%d",&t);
while (t--){
ll ans =1;
int cnt =1;
scanf("%d%d",&n,&m);
for(int i =1;i<=n;i++)
{
scanf("%d%d",&x,&y);
a[i] = x+y;
}
sort(a+1,a+1+n);
while(1){
if(ans*a[cnt]>m)break;
ans *= a[cnt++];
if(cnt>n){
break;
}
}
printf("%d\n",cnt-1);
}
return 0;
}
E
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[200][200],l[200];
int n;
ll Sum(int x,int y){
if(x < 0 || y < 0) {
return 0;
}
int N = (n<<1) ;
ll ans = a[N-1][N-1]*((x+1)/N)*((y+1)/N);
int xx = x%N,yy= y%N;
if(xx != N-1)ans += a[xx][N-1]*((y+1)/N);
if(yy != N-1)ans += a[N-1][yy]*((x+1)/N);
if(xx!=N-1&&yy!=N-1) ans +=a[xx][yy];
return ans ;
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&l[i]);
int cnt = 0;
for(int i =0;i<200;i++)
{
for(int j =0;j<=i;j++){
a[j][i - j] =l[cnt];
cnt = (cnt+1)%n;
}
}
for(int i=0;i<200;i++)
{
for(int j=0;j<200;j++)
{
if(i!=0)a[i][j] += a[i-1][j];
if(j!=0)a[i][j] += a[i][j-1];
if(i!=0&&j!=0) a[i][j] -= a[i-1][j-1];
}
}
int q;
scanf("%d",&q);
while(q--)
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ll ans = Sum(x2, y2) + Sum(x1 - 1, y1 - 1);
ans -= Sum(x2, y1 - 1) + Sum(x1 - 1, y2);
printf("%lld\n", ans);
}
}
}
K
#include<bits\stdc++.h>
using namespace std;
const int maxn = 1e6+7;
#define ll long long
char ss[maxn];
int n;
int main(){
int n;
scanf("%d",&n);
while(n--){
int Flag = 1,flag = 1;
scanf("%s",ss);
char op ;
int len = strlen(ss);
if(ss[0]=='*'||ss[0]=='+'){
printf("IMPOSSIBLE\n");
continue;
}
if(ss[0]=='?')
{
for(int i=0;i<len;i++){
if(ss[i]=='?')ss[i]='1';
if(ss[i]=='+'||ss[i]=='*')
{
if(ss[i+1]=='*'||ss[i+1]=='+'){Flag = 0;break;}
else if(ss[i+1]=='0')
{ if(i+2<len)
{
if(ss[i+2]=='+'||ss[i+2]=='*')continue;
else if(ss[i+2]=='?')ss[i+2]='+';
else {Flag = 0;break;}
}
}
}
}
}
//shuzi
else{
if(ss[0]=='0')
{
if(len==1){
printf("%s\n",ss);continue;
}
if(ss[1]=='?'){ss[1]='+';}
if(ss[1]=='*'||ss[1]=='+')
{
for(int i=1;i<len;i++)
{
if(ss[i]=='?')ss[i]='1';
if(ss[i]=='+'||ss[i]=='*')
{
if(ss[i+1]=='*'||ss[i+1]=='+'){Flag = 0;break;}
else if(ss[i+1]=='0')
{
if(i+2<len)
{
if(ss[i+2]=='+'||ss[i+2]=='*')continue;
else if(ss[i+2]=='?')ss[i+2]='+';
else {Flag = 0;break;}
}
}
}
}
}
else Flag=0;
}
else {
for(int i=0;i<len;i++)
{
if(ss[i]=='?')ss[i]='1';
if(ss[i]=='+'||ss[i]=='*'){
if(ss[i+1]=='*'||ss[i+1]=='+'){Flag = 0;break;}
else if(ss[i+1]=='0')
{
if(i+2<len)
{
if(ss[i+2]=='+'||ss[i+2]=='*')continue;
else if(ss[i+2]=='?')ss[i+2]='+';
else {Flag = 0;break;}
}
}
}
}
}
}
if(Flag ==0||ss[len-1]=='*'||ss[len-1]=='+'){
printf("IMPOSSIBLE\n");
}
else printf("%s\n",ss);
}
return 0;
}