题意:序列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).
先确定对于给定的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;
}