您的位置:首页 > 其它

CF 899D Shovel Sell 思维.

2017-12-20 16:22 288 查看
题意:序列1,2....n. 问从中选出两个数(x,y) 要让x+y末尾9的个数最多.问有多少种方案? n<=1e9.

先确定对于给定的n 末尾9的个数最多为多少? 

假如末尾9的个数最多为x,则有 n+(n-1)+1>=10^x

末尾有x个9 那么首位y :y99999. 1=<y<9 y为最高位 否则末尾9的个数可以增大.

[1..n]中有多少对(a,b)满足 a+b=y.

如果y<=n 那么有(y-1)/2 对(a,b)满足相加等于y. (1,y-1),(2,y-2)...(y/2-1,y/2+1).
如果y>=n 受到n限制 (a,b)对数为 max(0,n-y/2))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,x=1,num=0;
int main()
{
cin>>n;
while(2ll*n>=x)
x*=10,num++;
x/=10,num--;
// cout<<num<<endl;
ll res=0;
for(int i=1;i<=9;i++)
{
ll y=x*i-1;
if(y<=n)
res+=(y-1)/2;
else
{
ll mid=y/2;
res+=max(0ll,n-mid);
}
}
cout<<res<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: