Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF題解
題目總連結:https://codeforces.com/contest/1096
A. Find Divisible
題意:
給出l,r,在[l,r]裡面找兩個數x,y,使得y%x==0,保證有解。
題解:
直接輸出l,2*l就好啦,但我還是寫了個迴圈...
程式碼如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 10; int T; ll l,r; int main(){ cin>>T;View Codewhile(T--){ scanf("%I64d%I64d",&l,&r); for(ll i=l;i<=r;i++){ if(i*2<=r){ printf("%I64d %I64d\n",i,2*i); break ; } } } return 0; }
B. Substring Removal
題意:
給出一個字串,現在要你刪掉一個子串,使得剩下的串有不多於一個的字元。
題解:
從兩端找連續的相同字串並且統計個數,然後算算就可以了。
注意一下所有字串都相等的情況。
還有一種情況就是兩段連續的字串字元都相等,那麼這時就可以刪掉中間的,這個個數也比較好統計。
具體見程式碼(注意中間計算過程不要爆int):
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5,MOD = 998244353; int n; char s[N]; int main(){ scanf(View Code"%d",&n); scanf("%s",s); char fir = s[0]; int i; ll cnt1=1,cnt2=1; for(i=1;i<n;i++){ if(s[i]==fir) cnt1++; else break ; } char last = s[n-1]; for(i=n-2;i>=0;i--){ if(s[i]==last) cnt2++; else break ; } ll ans = (cnt1+cnt2+1)%MOD; if(last==fir){ ans=(ans+cnt1*cnt2)%MOD; } cout<<ans<<endl; return 0; }
C. Polygon for the Angle
題意:
給出一個角度(0<=angle<180),求出最小的正多邊形,滿足其中存在一個內接三角形的內角與給出的角度相等。
題解:
我的做法比較暴力了,先說說我的吧:
n邊形的內角和為(n-2)*180,然後可以知道其每個內角為(n-2)*180/n,利用外接圓+一些圓的性質(圓心角等於二倍圓周角)可以知道一個正n邊形的內接三角形的最小角為180/n。
之後只要判斷angle%(180/n)是否為0就是了。注意最小角可以為小數,所以我直接是暴力迴圈...
正解是這樣的,首先推出最小角為180/n,然後如果滿足angle%(180/n)==0的話,則有n*angle=t*180。
由於180和angle為已知量,我們就可以求出g=gcd(angle,180),然後等式則有n*angle/g = t*180/g。
由這可以知道n=x*180/g , t=y*angle/g,我們知道,這裡的t滿足t*180/n=angle,當t=n-2時,這時就是正多邊形的內角,所以有限制條件:1<=t<=n-2。
我們取x=y=1,這裡的n就是答案了(貪心),但是可能會存在這種情況:t=n-1,這時不符合限制條件的,這裡我們只要取x=2就行了。
可以證明,當x>=2時,t<=n-2恆成立。
給出我的暴力程式碼....
#include <bits/stdc++.h> using namespace std; typedef long long ll; int T; int ang; int main(){ cin>>T; while(T--){ scanf("%d",&ang); double ans ; int flag; for(int i=3;i<=360;i++){ ans = (double)180/i; flag=0; if(180%i!=0) for(int j=1;;j++){ if(j*ans>ang){ flag=1; break ; }else if((double)j*ans==(double)ang){ cout<<i<<endl; flag=2; break ; } } if(flag==1) continue ; else if(flag==2) break ; if(ang%(int)ans==0&&ans*(i-2)>=ang){ cout<<i<<endl; break ; } } } return 0; }View Code