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

AtCoder Beginner Contest 195題解

Health M Death

題目大意

輸入兩個數\(n\)\(m\),判斷\(m\)是否整除\(n\)

題解

如果\(m\%n=0\),輸出\(Yes\),否則輸出\(No\)

程式碼

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	if(b%a==0)
	puts("Yes");
	else
	puts("No");
	return 0;
} 

Many Oranges

因為某種原因,所以咕掉了。

Comma

題目大意

我們規定對於一個數\(k\)

,每\(3\)位用一個逗號隔開。

如:\(1,234,567\)

輸入一個數\(n\),求表示\(1\)~\(n\)要幾個逗號。

題解

看到資料範圍,就知道這道題暴力過不了,需要優化。

很明顯,對於\(1\)$999$,沒有一個逗號,對於$1000$\(10^6-1\),每個數都有一個逗號,對於\(10^6\)~\(10^9-1\),每個數都有兩個逗號……。

我們可以把這個數\(n\)分成不同的幾段,然後再根據每段個數乘以這段每個數有多少逗號,就是這段逗號的總數,答案就是所有段總數之和。

如:\(2000\)可以分為\(1\)$999$和$1000$\(10^6-1\)兩段,第一段沒有逗號,第二段有\((2000-1000+1) \cdot 1\)

個逗號,一共就有\(0+(2000-1000+1) \cdot 1\)個逗號。

因為資料到了\(10^{15}\),所以我們分\(5\)段,分別是

  1. \(1\)~\(999\):有\(0\)個逗號
  2. \(1000\)~\(10^6-1\):有\(1\)個逗號
  3. \(10^6\)~\(10^9-1\):有\(2\)個逗號
  4. \(10^9\)~\(10^{12}-1\):有\(3\)個逗號
  5. \(10^{12}\)~\(10^{15}-1\):有\(4\)個逗號

當然還有注意一下\(10^{15}\)\(5\)個逗號,程式碼直接判斷\(n\)可以分為哪一段,時間複雜度是\(O(1)\),long long 有點坑。

程式碼

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n,ans;
	scanf("%lld",&n);
	if(n<1e3)
	{
		cout<<0;
		return 0;
	}
    if(n<1e6)
	{
		cout<<(long long)(n-1e3+1);
		return 0;
	}
	if(n<1e9)
	{
		cout<<(long long)(1e6-1e3+2*(n-1e6+1));
		return 0;
	}
	if(n<1e12)
	{
		cout<<(long long)(1e6-1e3+2*(1e9-1e6)+3*(n-1e9+1));
		return 0;
	}
	if(n<1e15)
	{
		cout<<(long long)(1e6-1e3+2*(1e9-1e6)+3*(1e12-1e9)+4*(n-1e12+1));
		return 0;
	}
	if(n==1e15)
	{
		cout<<(long long)(1e6-1e3+2*(1e9-1e6)+3*(1e12-1e9)+4*(1e15-1e12)+5);
		return 0;
	}
	return 0;
}