本文主要是介绍聪明的燕姿(数论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题目背景】
阴天傍晚车窗外
未来有一个人在等待
向左向右向前看
爱要拐几个弯才来
我遇见谁会有怎样的对白
我等的人他在多远的未来
我听见风来自地铁和人海
我排着队拿着爱的号码牌
【题目描述】
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。
可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于 S。
所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。
输入格式:
输入包含k
组数据。对于每组数据,输入包含一个号码牌S。
输出格式:
对于每组数据,输出有两行,第一行包含一个整数m,表示有m个等的人。
第二行包含相应的m
个数,表示所有等的人的号码牌。
注意:你输出的号码牌必须按照升序排列。
【Input】
42
【Output】
320 26 41
【分析】
首先这题要用到几个数论里的定理,当我第一眼看这些定理的时候,我是很懵逼的。先给出定理的公式。
首先,这里要用到
1.惟一分解定理:
2.约数和定理 :
首先惟一分解定理:每个大于1的自然数n均可分解为有限个素数之积,就比如
【Input】
12
【Output】
2 2
3 1
下面是代码实现
#include<bits/stdc++.h>
using namespace std;
void fta(int n)
{for(int i=2;i*i<=n;++i){int a=0;if(n%i==0){while(n%i==0){n/=i;a++;}printf("%d %d\n",i,a);}}if(n>1){printf("%d %d\n",n,1);}
}
int main ()
{int n;cin>>n;f
这篇关于聪明的燕姿(数论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!