#CYF0020. 最大化乘积

最大化乘积

题目背景

这是一个简单的数学问题,同时也在考核 int128 的使用方式,int128 需要自己编写输入和输出函数,不可使用 cin 、cout、scanf、printf 完成。具体内容看下方代码:

__int128 read() {
	__int128 res = 0; // 结果
	string s; cin >> s;	// 直接读取字符串即可
	for(int i = 0; i < s.size(); i++) {res *= 10, res += s[i] - '0';}	// 将字符串每一位处理出来记录在 res 中
	return res;	// 将结果返回出去
}

void print(__int128 num){	
	if(num > 9) print(num / 10);	// 递归输出知道结束。
	putchar(num % 10 + '0');	// 输出其实是以字符的方式输出的
}

C 发现一个数字可以分为两个数字的和,比如: 6 可以分为 0 + 61 + 52 + 43 + 34 + 25 + 16 + 0 ,然后这两个数字的乘积根据数字的不同结果也是不同的。比如 : 0 * 6 = 01 * 5 = 52 * 4 = 83 * 3 = 9···

题目描述

C 想要最大化这个乘积,操作是:选择两个和为 nn 的数字 a,ba, b,使得这两个数字的乘积是所有选择方案中最大的。

输入格式

输入一行。

第一行输入一个正整数 nn

输出格式

输出两行。

第一行输出满足题意的两个正整数 a,ba, b

第二行输出最大的乘积。

样例 #1

样例输入 #1

6

样例输出 #1

3 3
9

样例 #2

样例输入 #2

12

样例输出 #2

6 6
36

提示

样例解释】:

【样例解释1】:见题面。

【样例解释2】:无

数据范围】:

对于 20%20\% 的数据保证 0n1030 \leq n \leq 10^3

对于 60%60\% 的数据保证 0n1090 \leq n \leq 10^9

对于 100%100\% 的数据保证 0n10180 \leq n \leq 10^{18}