Codeforces Round #691 (Div. 2)
阿新 • • 發佈:2020-12-20
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打完以後晚上沒睡著,把英語課曠了,唉。