1. 程式人生 > >Educational Codeforces Round 57 (Rated for Div. 2) 前三個題補題

Educational Codeforces Round 57 (Rated for Div. 2) 前三個題補題

感慨

最終就做出來一個題,第二題差一點公式想錯了,又是一波掉分,不過我相信我一定能爬上去的

A Find Divisible(思維)

上來就T了,後來直接想到了題解的O(1)解法,直接輸出左邊界和左邊界*2即可

程式碼

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long x,y,t;
  cin>>t;
  while(t--)
  {
    cin>>x>>y;
    cout<<x<<" "<<x*2<<"\n";
  }
}

B Substring Removal(思維)

我這裡想到了有兩種情況,其中第一種情況想的完全是正確的,第二種情況想的公式有問題。正確公式是(l+1) ×(r+1)我當時直接想的是l×r+2

程式碼

#include <bits/stdc++.h>
using namespace std;
int bk[300],bk1[300],mk[300],p,sum;
long long ans;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n,t1=0,t2=0;
  cin>>n;
  string a;
  cin>>a;
  for(int i=0;i<a.size();i++)
  bk[a[i]-'a']++;
  for(int i=0;i<26;i++)
  if(bk[i]>=2)
  sum++,mk[p++]=i,bk1[i]++;
  for(int i=0;i<a.size();i++)
  if(a[i]==a[0])
  t1++;
  else
  break;
  for(int i=a.size()-1;i>=0;i--)
  if(a[i]==a[a.size()-1])
  t2++;
  else
  break;
  if(a[0]==a[a.size()-1])
  {
    ans=(t1+1)*(t2+1);
    ans%=998244353;
    cout<<ans;
  }
  else
  cout<<t1+t2+1;
}

C Polygon for the Angle(數學)

完全的數學題,這裡得記住這個結論

正多邊形中存在的角度的範圍是180k/n(其中n是邊數,1<=k<=n-2)

這樣我們可以求出每個正多邊形都有可能有多少度角了

具體直接的演算法是運用gcd,其中gnu包含了一個內建的gcd函式__gcd

算出給定的角度與180的gcd,然後用原來的角度/gcd算出了k然後180/gcd算出了n

其中如果k+1==n那麼n*=2因為要保證k<=n-2

程式碼

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  cin>>t;
  while(t--)
  {
    int ang;
    cin>>ang;
    int g=__gcd(ang,180);
    int k=ang/g;
    int n=180/g;
    if(k+1==n)
    k*=2,n*=2;
    cout<<n<<"\n";
  }
}