C1. k-LCM (easy version)

Codeforces Round #708 (Div. 2) C1

C1. k-LCM (easy version)

It is the easy version of the problem. The only difference is that in this version k=3.

You are given a positive integer n. Find k positive integers a1,a2,…,ak, such that:

a1+a2+…+ak=n
LCM(a1,a2,…,ak)≤n2
Here LCM is the least common multiple of numbers a1,a2,…,ak.

We can show that for given constraints the answer always exists.

Input
The first line contains a single integer t (1≤t≤104) — the number of test cases.

The only line of each test case contains two integers n, k (3≤n≤109, k=3).

Output
For each test case print k positive integers a1,a2,…,ak, for which all conditions are satisfied.

Example
input
3
3 3
8 3
14 3
output
1 1 1
4 2 2
2 6 6

linkC1

分析:
一个数可分为 i ,n-i ,其中 (n - i) 又可分为 (n - i)/2 ,(n - i)/2;
则后两个数的lcm 一定满足条件 ;

1
当一个数为奇数时,则 分别为 1 , (n - 1 ) / 2 , (n - 1 ) / 2;
最小公倍数为 (n - 1) / 2 ,满足 lcm <= n / 2;

2
①当一个数为偶数时,若 偶数为 2的x次方 ,则 结果为 n / 2 , n / 4 , n / 4
②若 偶数 为 2的x次方 * 奇数 的形式,这里的奇数 >= 3, 则2 的x次方 < n / 2; 则 令i = 2的x次方,
(n - i ) / 2 则为 2 的x次方 * (奇数倍 - 1)/ 2 的 状态 , 一定小于 2 的 n次方 * 奇数倍 / 2 ,此时 的lcm 为 (n - i) / 2;

#include <iostream>

using namespace std;

int main()
{
	int t ;
	cin >> t;
	while(t --)
	{
		int n,k;
		cin >> n >> k;
		int i = 1,j = n;
		
		while(j % 2 == 0)
		{
			i *= 2;
			j /= 2;
		}
		if(j == 1)
		{
			i /= 2;
		}
	   
	    cout << i << ' ' << (n - i) / 2  << ' ' << (n - i)/2 ;
	    cout << endl;
	}
return 0;
} 
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于51单片机的矩阵键盘输入2761后数码管循环显示2761然后276.1然后27.61然后2.761然后7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-. 的代码: ``` #include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf}; //数码管显示0-9和.的编码 sbit L1 = P2^0; //矩阵键盘第一行 sbit L2 = P2^1; //矩阵键盘第二行 sbit L3 = P2^2; //矩阵键盘第三行 sbit L4 = P2^3; //矩阵键盘第四行 sbit C1 = P2^4; //矩阵键盘第一列 sbit C2 = P2^5; //矩阵键盘第二列 sbit C3 = P2^6; //矩阵键盘第三列 uchar keyscan() //矩阵键盘扫描函数 { uchar val = 0xff; //初始化键值 L1 = 0; //第一行置低电平 if (C1 == 0) {val = 1;} //第一列检测按键 if (C2 == 0) {val = 2;} //第二列检测按键 if (C3 == 0) {val = 3;} //第三列检测按键 L1 = 1; //第一行恢复高电平 L2 = 0; //第二行置低电平 if (C1 == 0) {val = 4;} //第一列检测按键 if (C2 == 0) {val = 5;} //第二列检测按键 if (C3 == 0) {val = 6;} //第三列检测按键 L2 = 1; //第二行恢复高电平 L3 = 0; //第三行置低电平 if (C1 == 0) {val = 7;} //第一列检测按键 if (C2 == 0) {val = 8;} //第二列检测按键 if (C3 == 0) {val = 9;} //第三列检测按键 L3 = 1; //第三行恢复高电平 L4 = 0; //第四行置低电平 if (C1 == 0) {val = 0;} //第一列检测按键 if (C2 == 0) {val = 10;} //第二列检测按键 if (C3 == 0) {val = 0xff;} //第三列检测按键(不启用) L4 = 1; //第四行恢复高电平 return val; //返回键值 } void display(uchar num) //数码管显示函数 { static uchar pos = 0; //静态变量,记录数码管显示的位置 static uchar data[] = {0, 0, 0, 0}; //静态数组,保存数码管显示的数据 uchar i = 0; //循环计数器 if (num == 10) //按下小数点键 { pos = 1; //从第二位开始显示 data[0] = 0; //第一位清零 } else //按下数字键 { if (pos == 0) //整数部分 { data[3] = data[2]; data[2] = data[1]; data[1] = data[0]; data[0] = num; } else //小数部分 { data[pos-1] = num; } pos++; //位置向后移动一位 if (pos > 4) {pos = 1;} //位置超出范围,回到第一位 } //数码管循环显示数据 for (i=0; i<4; i++) { P0 = table[data[i]]; //数码管显示对应的数字或小数点 delay(5); //延时一段时间,避免闪烁 P0 = 0xff; //关闭数码管 delay(5); //延时一段时间,避免闪烁 } } void main() { while (1) //循环执行 { uchar val = keyscan(); //扫描矩阵键盘 if (val != 0xff) //判断是否有按键按下 { display(val); //数码管显示对应的数字或小数点 } } } ``` 注意:以上代码仅供参考,具体实现可能需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值