1. 程式人生 > 其它 >AtCoder Beginner Contest 215題解

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;
 }