社区讨论

D

学术版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo27bsyp
此快照首次捕获于
2023/10/23 09:11
2 年前
此快照最后确认于
2023/11/03 09:25
2 年前
查看原帖
三分 waon7 求助/kk
CPP
//CF1848D
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 2e5 + 10;
int t, s, k;
//#define __int128 int
__int128 f[10][31], w[10][31];


void wr(__int128 k){
	if(!k) return;
	wr(k/10);
	putchar(k % 10 + '0');
}
//bool chk(int x){
//	__int128 p = s;
//	int pp = s;
//	for(int i = 30; i >= 0; -- i){
//		if((x >> i) & 1){
//			int v = pp % 10;
//			p += w[v][i] *10 + f[v][i];
//			pp = f[v][i];
//		}
//	}
//	__int128 ppp = k - x;
////	printf("%d %d %d\n", x, p, ppp);
//	return p >= ppp ? 1 : 0;
//}
__int128 clc(int x){
	__int128 p = s;
	int pp = s;
//			putchar('[');wr(p);putchar(']');
	for(int i = 30; i >= 0; -- i){
		if((x >> i) & 1){
			int v = pp % 10;
			p -= v;
			p += w[v][i] *10 + f[v][i];
//			putchar('[');wr(w[v][i]);putchar(']');
//			putchar('[');wr(p);putchar(']');
			pp = f[v][i];
		}
	}
	__int128 ppp = k - x;
//	printf("%d ", x); wr(p);printf(" |1 "); wr(ppp); printf(" |2 "); wr(p*ppp); putchar('\n');
//	printf("%d %d %d\n", x, p, ppp);
	return p * ppp;
}

void solve(){
	for(int i = 0; i < 10; ++ i){
		f[i][0] = (i + i) % 10;
		w[i][0] = (i + i) / 10;
	}
	for(int i = 1; i < 31; ++ i){
		for(int j = 0; j < 10; ++ j){
			f[j][i] = f[f[j][i-1]][i-1];
			w[j][i] = w[f[j][i-1]][i-1] + w[j][i-1];
//			printf("%d %d %d %d\n", j, i, w[j][i], f[j][i]);
		}
	}
	scanf("%d", &t);
	while(t--){
		scanf("%d%d", &s, &k);
		if(s%10 == 0){
			printf("%lld\n", (ll)s*k);
			continue;
		} else if(s%10 == 5){
			printf("%lld\n", max((ll)s*k, (ll)(s+5ll)*(k-1)));
			continue;
		}
		int l = 0, r = k;
		while(l + 100 < r){
			int mid = l + r >> 1;
			__int128 x = clc(max(0, mid-20));
			__int128 y = clc(min(k, mid+20));
			if(x > y){
				r = mid;
			} else {
				l = mid;
			}
		}
		__int128 ans = max(clc(0), clc(1));
		for(int i = l; i <= r; ++ i){
//			if(clc(i) > ans){
//				printf("%d\n", i);
//			}
			ans = max(ans, clc(i));
		}
		if(ans == 0){
			puts("0");
			continue;
		}
		wr(ans);
		puts("");
	}




}

int main(){
	solve();
	return 0;
}

/*

*/

//qwq

回复

2 条回复,欢迎继续交流。

正在加载回复...