把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

fxtoi 矩阵乘法

题面传送门

这个东西显然不能矩阵乘法(暴论)

考虑手推几组数据。

比如这组:

1
999 100000000000000

这东西怎么推啊,这不是要死人的节奏吗。

别急,推推看就知道了。

\(f_0=999\)

\(f_1=999+9\times 9=1080\)

\(f_2=1080+0\times 8=1080\)

你发现了什么?

当这个数位中出现\(0\)时就一定能无限循环。

然后你猜了结论交上去发现你切掉了。

这里来伪证一下复杂度。

一定会到一种时候\(*************9**\)

因为每次加最多\(9\times9=81\)

所以一定会加成这样\(*************0**\)

然后就可以跳出了。

而怎么样才能到达这种局面呢?

每隔\(900\)个数就会到达,就算每次加的都是\(1\),那么每组数据只要\(900\)次,而实际是不可能每次加\(1\)的,所以跑过\(5\times 10^4\)的数据是绝对可以的。

所以这道题实际上在教你做题,让你一定不要忘记手推小样例。而一般给你的样例都是精心构造的(暴论)。比如这道题,根本没有给出这一种情况。

代码实现:

#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int t,maxn,minn;
long long n,k,now; 
int main(){
//	freopen("matrix10.in","r",stdin);
//	freopen("matrix10.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&n,&k);
		while(k--){
			now=n;minn=1e9;maxn=0;
			while(now) minn=min(minn,now%10),maxn=max(maxn,now%10),now=now/10;
			if(!minn) break;
			n+=minn*maxn;
		}
		printf("%lld\n",n);
	}
}
posted @ 2020-11-03 18:41  275307894a  阅读(68)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end