思路不算难,只是会乘爆
#include
using namespace std;
const int N=1e5+7;
long long phi[N]={1000000007, 1000000006, 500000002, 243900800, 79872000, 19660800, 5242880, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1};
char w[N];
long long pow_mod(long long a, long long b, long long m){
long long ans=1;
a%=m;
while(b){
if(b&1) ans=(ans*a)%m;
a=(a*a)%m;b>>=1;
}
return ans%m;
}
int main( ){
fill(phi+28, phi+N, 1);
register int n, i, cnt;
scanf("%d",&n);
while(n--){
scanf("%s",w);
long long tims = 0;
cnt=0;
for(i=0; w[i]!=0; ++i)
cnt+=(w[i]=='2');
long long MOD=phi[cnt];
for(i=0; w[i]; i++){
if(w[i]=='1')
tims=(tims+tims+2)%MOD;
else if(w[i]=='0')
tims=(tims+1)%MOD;
else{
tims=(3ll*(pow_mod(2, tims%phi[cnt]+1, phi[cnt-1])-1+phi[cnt-1])%phi[cnt-1]+phi[cnt-1])%phi[cnt-1];
cnt--;
MOD=phi[cnt];
}
}
tims=(tims%MOD+MOD)%MOD;
printf("%lld\n",tims);
}
return 0;
}
构造题,缺一个证明
#include
using namespace std;
int A[500][500];
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(n&1){
printf("impossible\n");
continue;
}
else{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(j
#include
#include
#include
#include
#include
using namespace std;
char g[2020][2020];
int main(){
int t;
while(~ scanf("%d", &t)){
while(t --){
int n, m;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i ++){
scanf("%s", g[i]);
}
int limr = 1, limc = 1;
for(int i = 0; i < n ; i ++){
for(int j = 0; j < m ; j ++){
if(g[i][j] != g[n - i - 1][j]){
limr = max(limr, abs(n / 2 - i));
}
if(g[i][j] != g[i][m - j - 1]){
limc = max(limc, abs(m / 2 - j));
}
}
}
int ans1 = n / 2 - limr, ans2 = m / 2 - limc;
printf("%d\n", ans1 * ans2);
}
}
return 0;
}
#include
#include
#include
#include
线段树优化建图
#include
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const int INF=0x3f3f3f3f;
const int MAXN=2e5+5;
vector G[MAXN*6];
struct Point{
int du,num,id;
friend bool operator <(const Point a,const Point b){
return a.num>b.num;
}
}pt[MAXN*6];
int a[MAXN];
bool flag[MAXN<<2];
int tree[MAXN<<2],ind;
void pushup(int rt){
G[tree[rt<<1]].push_back(tree[rt]);
G[tree[rt<<1|1]].push_back(tree[rt]);
pt[tree[rt]].du+=2;
flag[rt]=flag[rt<<1]||flag[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
tree[rt]=l;
G[tree[rt]].clear();
pt[tree[rt]].du=0;
pt[tree[rt]].num=a[l];
pt[tree[rt]].id=l;
if(a[l]<0) flag[rt]=true;
else flag[rt]=false;
return;
}
tree[rt]=ind++;
G[tree[rt]].clear();
pt[tree[rt]].du=0;
pt[tree[rt]].num=-2;
pt[tree[rt]].id=tree[rt];
int m=(l+r)/2;
build(lson);
build(rson);
pushup(rt);
}
bool add(int L,int R,int to,int l,int r,int rt){
if(L<=l&&r<=R){
G[tree[rt]].push_back(to);
pt[to].du++;
return flag[rt];
}
int m=(l+r)/2;
bool ret=false;
if(L<=m) ret=ret||add(L,R,to,lson);
if(m=0) have++;
}
ind=mod;
build(0,mod-1,1);
bool temp=false;
for(int i=0;i=0){
int pos=a[i]%mod;
if(posi){
if(i>0)
temp=temp||add(0,i-1,i,0,mod-1,1);
temp=temp||add(pos,mod-1,i,0,mod-1,1);
}
if(temp){
puts("-1");
break;
}
}
}
if(temp) continue;
for(int i=0;i