Codeforces899D Shovel Sale(思路)
http://codeforces.com/problemset/problem/899/D
还是得tag一下,以下代码只有G++ 14 6.4.0能过,其他都过不了不知为什么?
思路:先求出最多的9的个数,发现最多的9的个数总比2*n的位数少一位。t存储9的位数,sum则是该值。
然后对这个sum加上先导0~9,由于序列是连续的,可以先判断sum是可以分解为1+x还是由x+n,然后判断1~x或者x~n有多少位,位数/2就是该值的方案。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<cmath> 7 #define IO ios::sync_with_stdio(false);cin.tie(0); 8 const int MOD=1e9+7; 9 typedef int ll; 10 using namespace std; 11 ll n; 12 int main() 13 { 14 IO; 15 while(cin >> n){ 16 ll m = 2*n, cnt=0; 17 while(m){ 18 cnt++; 19 m /= 10; 20 } 21 ll t = cnt-1; 22 ll r=1, sum=0; 23 while(t--){ 24 sum += r*9; 25 r = r*10; 26 } 27 ll tmp = pow(10, cnt-1), ans=0; 28 for(int i = 0; i < 10; i++){ 29 ll k = sum+tmp*i; 30 if(k>n+(n-1)){ 31 break; 32 } 33 if(k-1>n){ 34 ll p = k-n; 35 ans += (n-p+1)/2; 36 } 37 else{ 38 ll p = k-1; 39 ans += (p-1+1)/2; 40 } 41 } 42 cout << ans << endl; 43 } 44 return 0; 45 }