AtCoder Beginner Contest 215題解
前言
這次ABC是我排名最低的一次了emmmm......
蒟蒻只會ABCD,然後賽後才會了E,可能E的題解要咕一段時間。
Your First Judge
題目大意
你是一隻測評雞,要測評Hello World,具體的如果輸入與Hello,World!
相同輸出AC,否則輸出WA。
題解
原來ABC也考Hello World啊......
程式碼
#include<bits/stdc++.h> using namespace std; int main() { string s; cin>>s; if(s=="Hello,World!")puts("AC"); else puts("WA"); return 0; }
log2(N)
題目大意
給出一個數字\(n\),求\(\log_2n\)向下取整的值。
題解
題解
C++的黑科技\(\operatorname{lg}\)函式,當然不屬於標準庫,正式比賽時禁用。
注意直接使用\(\log\)函式會爆精度,所以要開long double
,當然如果資料很大那開long double
也沒用。
程式碼
#include<bits/stdc++.h> using namespace std; int main() { long long n; cin>>n; cout<<__lg(n)<<endl; return 0; }
One More aab aba baa
題目大意
給你一個字串,求這個字串的排列中第\(k\)個排列。
題解
注意字串的第\(1\)個排列並不一定是它自己,而是它的字元按字典序排列後的,舉個例子:
字串:aab
的初始排列為aab
,但baa
的初始排列為aab
。
直接先求出初始排列再求出第\(k\)個排列即可,用STL
非常方便。
程式碼
#include<bits/stdc++.h> using namespace std; char a[10001]; int main() { int k; cin>>a>>k; sort(a+0,a+strlen(a)); for(int i=1;i<k;i++) next_permutation(a+0,a+strlen(a)); cout<<a; return 0; }
Coprime 2
題目大意
給你\(n\)個數\(a_1,a_2,...,a_n\),求\(1\)~\(m\)中有哪幾個數\(p\)滿足\(\gcd(a_i,p)=1(1\le i\le n)\)。
題解
首先\(O(nm\log a_i)\)的暴力是很好想的,直接按照題意模擬就可以了,然後發現過不了,考慮優化。
什麼時候\(\gcd=1\)呢,很明顯是兩個數沒有共同的約數時,所以我們可以先把每個數的約數預處理出來,打上標記,然後再從\(2\)掃到\(m\),看看有它沒有約數相同(也就是說被標記),如果沒有,代表找到了一個數,當然,\(1\)與任何數的最大公約數都是\(1\),所以答案要加\(1\),預處理為\(O(n\sqrt a_i)\),找約數為\(O(m\sqrt m)\),總時間複雜度為\(O(n\sqrt a_i+m\sqrt m)\),可以通過此題。
這個D應該算簡單了,最多是黃題。
程式碼
#include<bits/stdc++.h>
using namespace std;
int ans[1000001];
bool ok[1000001];
int check(int a)
{
if(ok[a]==true)
return false;
for(int i=2;i*i<=a;i++)
if(a%i==0&&(ok[i]==true||ok[a/i]==true))
return false;
return true;
}
int main()
{
int n,m,tot=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int p;
scanf("%d",&p);
for(int j=1;j*j<=p;j++)
if(p%j==0)ok[j]=ok[p/j]=true;
}
for(int i=2;i<=m;i++)
if(check(i))tot++,ans[tot]=i;
cout<<tot+1<<endl<<1<<endl;
for(int i=1;i<=tot;i++)
cout<<ans[i]<<endl;
return 0;
}