A集合计数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int num[100007];
int mod = 1000000007;
#define ll long long
ll cal(ll a, ll b){
if(b < 0) return 0;
ll ans = 1;
while(b){
if(b&1) ans = ans * a % mod;
a = a * a % mod;
b = b / 2;
}
return ans;
}
int main(){
ll n,k;
while(cin>>n>>k){
for(int i = 0;i < n; i++){
scanf("%d",&num[i]);
}
sort(num,num+n);
int p = 0;
ll ans = 0;
for(int i = 0;i < n; i++){
while(p < i - 1 && num[p+1] + num[i] <= k)
p++;
while(p>=0 && num[p] + num[i] > k)
p--;
if(p == -1) break;
ans += (cal(2,p+1)-1)*(cal(2,i-p-1))%mod;
if(num[i] * 2 <= k) ans ++;
ans %= mod;
}
cout<<ans<<endl;
}
}
B 迷宫探索
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char map[500][500];
int main(){
int n,m;
while(cin>>n>>m){
for(int i = 0;i <= 2*n+1;i++)
for(int j = 0;j <= 2*m+1; j++)
if((i&1) && (j&1))
map[i][j] = ' ';
else map[i][j] = '+';
int x = 1, y = 1, f = 0;
int dir[4][2] = {
0,1,
1,0,
0,-1,
-1,0
};
int face[3];
char next[2];
for(int i = 0;i < 2 * n * m - 1; i++){
scanf("%d%d%d%s",&face[0],&face[1],&face[2],next);
for(int j = 0;j < 3; j++){
int u = (f + j) % 4;
int xx = (x +dir[u][0]);
int yy = y + dir[u][1];
if(face[j] == 0)
map[xx][yy] = ' ';
else if(xx & 1) map[xx][yy] = '|';
else map[xx][yy] = '-';
}
switch(next[0]){
case 'l': f = 1; y-=2; break;
case 'u': f = 2; x-=2; break;
case 'r': f = 3; y+=2; break;
case 'd': f = 0; x+=2; break;
}
}
for(int i = 0;i <2*n+1; i++){
for(int j = 0;j < 2 * m + 1; j++)
putchar(map[i][j]);
puts("");
}
}
}