您的位置:首页 > 其它

【洛谷2022】 神奇数学题

2016-10-31 20:03 211 查看
算法过程:先算出比现在小的有多少个,和之后在末尾添加能够优化的数量分别记录为cnt,p;

然后因为每多一位P*10即可。

标程来自网络单纯叙述题解的解法。

//copy 标程 特注明
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll N,M,K,cnt,base=1;
ll fj[21],s[21];
void get(ll x)
{
ll t=0;
while (x){s[++t]=x%10;x/=10;base*=10;}base/=10;
for (int i=1;i<=t;i++) fj[i]=s[t-i+1];
cnt+=t-1;
for (int i=t;i>=1;i--)
{
ll sum=0;
for (int j=1;j<=i;j++)
if (j!=1)sum*=10,sum+=fj[j];
else sum*=10,sum+=fj[j],sum-=1;
cnt+=sum;
}
}

int main()
{
cin>>K>>M;
get(K);
if (cnt>=M||(K==base&&cnt<M-1)) {cout<<0<<endl; return 0;}
ll p=K-base,c=K;
//cout<<p<<" "<<cnt<<endl;
for (;cnt<M-1;)
{
p*=10;c*=10;
cnt+=p;
}
//cout<<K<<" "<<c<<' '<<cnt-M+2<<endl;
N=max(K,c-(cnt-M+2));
cout<<N<<endl;
return 0;
}

   }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: