AtCoder Beginner Contest 195題解
阿新 • • 發佈:2021-08-04
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\)
如:\(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\)
因為資料到了\(10^{15}\),所以我們分\(5\)段,分別是
- \(1\)~\(999\):有\(0\)個逗號
- \(1000\)~\(10^6-1\):有\(1\)個逗號
- \(10^6\)~\(10^9-1\):有\(2\)個逗號
- \(10^9\)~\(10^{12}-1\):有\(3\)個逗號
- \(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; }