A. Red-Blue Shuffle
这题求问概率没啥好说的,首位决定一切,比较首位个数。
B. Move and Turn
竖着走以后只能横着走,横着走以后只能竖着走。
开始像暴力搜索,然后炸了。炸了以后开始找规律。
按他的说法打表,打出来以后按奇偶位找规律。
打表代码如下
ll id=0; struct node{ int x,y; int dir; int step; ll num; bool operator<(const node& a) const{ return num<a.num; } }; queue<node>q; map<pair<int, int> ,int> mp; map<node,int>mp2; int main(){ int n;cin>>n; ll ans=0,num=0; q.push((node){1,1,0,0,++id}); q.push((node){1,1,1,0,++id}); while(!q.empty()){ node now=q.front(); q.pop(); if(mp2[now]==0){ mp2[now]++; } else{ continue; } if(now.step==n){ pair<int ,int > pp= make_pair(now.x,now.y); if(mp[pp]==0){ mp[pp]=1; ans++; } } else{ if(now.dir==1){ q.push((node){now.x+1,now.y,0,now.step+1,++id}); q.push((node){now.x-1,now.y,0,now.step+1,++id}); } else if(now.dir==0){ q.push((node){now.x,now.y+1,1,now.step+1,++id}); q.push((node){now.x,now.y-1,1,now.step+1,++id}); } } } cout<<ans<<endl; return 0; }
ac代码如下:
const int N=1e4+7; int a[N],pos=1,num=0; int main(){ int n; for(int i=1;i<=1000;++i){ num+=i; a[pos]=4*num; pos+=2; } for(int i=1;i<=1000;++i){ if(i%2==0){ a[i]=(i/2+1)*(i/2+1); } } cin>>n; cout<<a[n]<<endl; return 0; }
C. Row GCD
我们目标是求出GCD(a1+k,a2+k,a3+k,a4+k,.......,an+k)
我们学过辗转相减法,GCD(a,b)=GCD(a,b-a)
而上面的一大串东西,实际上两两求GCD,那么两个之间就能合法的消去k
继而我们得到原式=GCD(a1+k,a2-a1,a3-a2,an-an-1)
发现后面是不变的值,那么我们只需要根据b的变化改变 a1+k 就好了
注意实现的时候qq初始设为0,这样n==1时,我们就不用特判了。
如果qq初始设为a[2]-a[1]的话,n==1时,不存在该值,会出错。
const int N=2e6+7; int n,m; ll a[N],b[N]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); } for(int i=1;i<=m;++i){ scanf("%lld",&b[i]); } sort(a+1,a+1+n); ll qq=0; for(int i=2;i<=n;++i) qq=__gcd(qq,a[i]-a[i-1]); for(int i=1;i<=m;++i){ ll ans=__gcd(a[1]+b[i],qq); printf("%lld ",ans); } return 0; }
------------
周五的CF打完以后晚上没睡着,把英语课旷了,唉。