P11059 [入门赛 #27] 数字 (Hard Ver.)题解

Solution

先读题:

在给定x的位数n和模数p后,要求构造一个x在满足xmodp的余数尽可能小的前提下使x的数字尽可能小。

我们假设x的各位数字之和为m,有1m9n。.
(当x仅在最高位有1时m=1,称为情况一,当x每位为9时m=9n,称为情况二)
此时对于m有两种情况:

p>9np=1时无需构造,属于情况一。

1<p9n时需构造,属于情况二,且可以简单证明必定有一个合法x使xmodp=0

做法:

对于情况二,容易想到一种贪心解法,此时的模数p可直接看作能在每一位放的所有数字之和,步骤如下:

  1. 在最高位先放数字1维持x合法并是p减1。
  2. 再从最低位开始放数字,当p>=9时该位放9且让p减去9,当1p8且不为最高位时使该位为p,接着走向较高的下一位。
  3. 放置过程中若p=0,那么说明所有数字放完,退出。
  4. 若在最高位仍有p>0,那么时最高位为p+1(在步骤一中最高位已经放了1,再加上此时的p)并退出。

复杂度分析:

因为按位放数字,有n位,复杂度为O(n),且1n106,该方式可行。

Code

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int n,p,a[N],idx=1;
int main() {
	cin>>n>>p;
	if(n*9<p){
		putchar('1');
		for(int i=1;i<n;++i)putchar('0');
	}else{
		p--;
		while(idx!=n&&p){
			if(p>=10)a[idx]=9;
			else a[idx]=p;
			p-=a[idx];
			++idx;
		}
		a[n]=++p;
		for(int i=n;i>=1;--i)cout<<a[i];
	}
    return 0;
}
posted @   badn  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示