题目描述
森近霖之助捡到了一台奇怪的机器。往里面塞进去两条固定长度的打孔纸带,就会吐出一条同样长
度的打孔纸带。打印出来的纸带是没法放进机器里的。
在经过一段时间的思索之后,霖之助发现了这台机器的输出具有一定的规律。具体而言,输出的每
一位都是输入两个打孔纸带上同样位置值的“与”,“或”或者“异或”。
拿着手中的纸带,若有所思的霖之助想要知道,他最少要自己制作多少条新的打孔纸带,才能知道
这台机器的确切工作方式?
输入
第一行,包含一个整数 N,表示已有纸带的数目。
接下来 N 行,每行包含一个字符串,表示已有的纸带的情况。
输出
一行,包含一个数,需要自己制作的纸带数。
样例输入
2 01010101 10101010
样例输出
1
提示
• 对于分值为 40 的子任务 1,保证 N <= 50,纸带长度 <= 10
• 对于分值为 60 的子任务 2,保证 N <= 50,纸带长度 <= 100。
#include<bits/stdc++.h> using namespace std; const int N=10001; int n,m,x,y,a[N]; int qx,qy,hx,hy,fx,fy,dx,dy; int q(int x) { int s=1; for(int i=0;i<x;i++) { s+=6*i; if(s>=x) return i; } } int h(int x,int k) { if(x>=a[k]-k) return k; else if(x>=a[k]-3*k) return k-(a[k]-k-x); else if(x>=a[k]-4*k) return -k; else return -k+a[k]-k*4-x; } int f(int x,int k) { if(x>=a[k]-k) return k-(a[k]-x)*2; else if(x>=a[k]-2*k) return -k-(a[k]-k-x); else if(x>=a[k]-3*k) return -k*2+(a[k]-k*2-x); else if(x>=a[k]-4*k) return -k+(a[k]-k*3-x)*2; else if(x>=a[k]-5*k) return k+(a[k]-k*4-x); else return k*2-(a[k]-k*5-x); } int main() { scanf("%d%d",&x,&y); a[0]=1; for(int i=1;a[i-1]<N;i++) a[i]=a[i-1]+6*i; qx=q(x),qy=q(y); hx=h(x,qx),hy=h(y,qy); fx=f(x,qx),fy=f(y,qy); dx=abs(hx-hy),dy=abs(fx-fy); if(dx>=dy) printf("%d",dx); else { m=dx,dy-=dx; printf("%d",m+(dy+1)/2); } return 0; }