题目描述

阴天傍晚车窗外
未来有一个人在等待
向左向右向前看
爱要拐几个弯才来
我遇见谁会有怎样的对白
我等的人他在多远的未来
我听见风来自地铁和人海
我排着队拿着爱的号码牌
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于S。
所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。

输入

输入包含k组数据(k<=100)

输出

对于每组数据,输出有两行,第一行包含一个整数m,表示有m个等的人,第二行包含相应的m个数,表示所有等的人的号码牌。注意:你输出的号码牌必须按照升序排列。

样例输入

42

样例输出

3
20 26 41

提示

对于100%的数据,有S<=2*10*9

题解

    一道显而易见的数学题,显而易见地我不会做。因为根本这个正解要用到的约数定理、约数和定理。唯一分解定理我都没学过,如果知道这些结论的话有没有推出答案的数学能力也未必。
唯一分解定理:
任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*…*Pn^an,这里P1<P2<…<Pn均为质数,其诸指数ai是正整数。这样的分解称为N的标准分解式。
约数和定理:
对于任意一个大于1的正整数N可以分解正整数:N=P1^a1*P2^a2…Pn^an,则由约数个数定理可知N的正约数有(a1+1)(a2+1)(a3+1)…(an+1)个,那么N的(a1+1)(a2+1)(a3+1)…(an+1)个正约数的和为f(N)=(P1^0+P1^1+P1^2+…P1^a1)(P2^0+P2^1+P2^2+…P2^a2)…(Pn^0+Pn^1+Pn^2+…Pn^an)。
用搜索将n分解为(p1^0+p1^1+…+p1^k1)(p2^0+p2^1+…+p2^k2)……(pn^0+pn^1+…+pn^kn),每一次成功的分解都会产生一个答案p1^k1*p2^k2*……*pn^kn。
搜索是很可行的。ad爷讲到对本题搜索的时间复杂度分析,当搜索的复杂度到了根号下根号n级别后就已经可以忽略了(高阶小量),所以对这种搜索的时间复杂度只用考虑前几层。考试时常打搜索,有时接近正解,有时T得厉害,如果能学会这些分析应该会对搜索有更准确的估计吧。搜索之前要先处理出需要范围内的素数,还要有一个判断是否素数的函数。在搜索中要传递的是枚举到哪个素数(要求素数递增)、已有的乘积和、余下的需要分解的数。在搜索函数内先枚举素数,再枚举乘方,枚举到可以整除的就向下搜索。搜索停止的条件一是分解到只剩1,二是分解到一个大素数+1(直接在此处停止可以省去许多本来没有必要的枚举)。
数学问题确实千古难题,不管是奥赛还是文化课。到底是哪里难,也说不出个一二三。破釜沉舟,誓死不向数学低头。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int sj=;
ll s,m,ps,p[],res[sj],ge;
bool fp[sj]={,};
void xxs()
{
for(int i=;i<;i++)
{
if(!fp[i])
{
ps++;
p[ps]=i;
}
for(int j=;j<=ps&&i*p[j]<sj-;j++)
{
fp[i*p[j]]=;
if(!(i%p[j]))
break;
}
}
}
int pss(ll x)
{
if(x==) return ;
for(int i=;p[i]*p[i]<=x;i++)
if(!(x%p[i]))
return ;
return ;
}
void dfs(int l,ll ji,ll yu)
{
if(yu==)
{
ge++;
res[ge]=ji;
return;
}
long long temp,f;
if((yu-)>p[l]&&pss(yu-))
{
ge++;
res[ge]=(yu-)*ji;
}
for(int i=l+;p[i]*p[i]<=yu;i++)
{
temp=;
f=;
for(int j=;temp<=yu;j++)
{
f*=p[i];
temp+=f;
if((yu%temp)==)
dfs(i,ji*f,yu/temp);
}
}
}
void cz()
{
while(scanf("%lld",&s)==)
{
memset(res,,sizeof(res));
ge=;
dfs(,,s);
if(ge!=)
{
sort(res+,res+ge+,less<int>());
printf("%lld\n",ge);
for(int i=;i<ge;i++)
printf("%lld ",res[i]);
printf("%lld\n",res[ge]);
}
else
printf("0\n");
}
}
int main()
{
xxs();
cz();
return ;
}
 

聪明的燕姿[JLOI2014]的更多相关文章

  1. BZOJ_3629_[JLOI2014]聪明的燕姿_dfs

    BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...

  2. bzoj3629 / P4397 [JLOI2014]聪明的燕姿

    P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...

  3. P4397 [JLOI2014]聪明的燕姿

    P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...

  4. 【LG4397】[JLOI2014]聪明的燕姿

    [LG4397][JLOI2014]聪明的燕姿 题面 洛谷 题解 考虑到约数和函数\(\sigma = \prod (1+p_i+...+p_i^{r_i})\),直接爆搜把所有数搜出来即可. 爆搜过 ...

  5. AcWing1296. 聪明的燕姿

    聪明的燕姿 解题思路: 首先我们肯定要用到约数之和定理 但是有个问题就是要怎么用 根据经验得知,约数最多也就六七个左右,不然直接就超了s的范围.所以我们考虑用爆搜来做 但是用爆搜的话还是要优化一下思路 ...

  6. [JLOI2014]聪明的燕姿(搜索)

    城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S, ...

  7. [补档][JLOI 2017]聪明的燕姿

    [NOI 2008]假面舞会 题目 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 ...

  8. bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...

  9. bzoj3629[JLOI2014]聪明的燕姿

    http://www.lydsy.com/JudgeOnline/problem.php?id=3629 搜索. 我们知道: 如果$N=\prod\limits_{i=1}^{m}p_{i}^{k_{ ...

随机推荐

  1. Javaee需不需要培训?培训完可以顺利找到工作吗?

    Javaee需不需要培训?培训完可以顺利找到工作吗? 在IT行业中Java以它通用性.高效性.平台移植性和安全性遍布各个领域,它的火热也给IT市场发展带来一定影响,随着Java技术的广泛运营,企业对J ...

  2. 关于php的一些安全知识

    绝不要以明文形式显示或发送密码.即使是对密码的所有者也应该这样.如果你需要 "忘记密码" 的功能,可以随机生成一个新的 一次性的(这点很重要)密码,然后把这个密码发送给用户 你希望 ...

  3. [leetcode-557-Reverse Words in a String III]

    Given a string, you need to reverse the order of characters in each word within a sentence whilestil ...

  4. 【Android Developers Training】 107. 认知用户当前的行为

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 移动端布局,C3新增属性

    <html5拖拽> 1.给元素设置 draggable="true" 属性,这个元素就可以被拖拽了 <拖拽元素事件> 2.ondragstart 拖拽前触发 ...

  6. mongodb远程连接配置

    mongodb远程连接配置如下: 1.修改配置文件mongodb.conf 命令:vim /etc/mongodb.conf 把 bind_ip=127.0.0.1 这一行注释掉或者是修改成 bind ...

  7. setTimeout与setInterval参数之String

    今天无意中给某网友解答了一些setTimeout的问题,发现一个有趣的东西. 以前我总认为setTimeout的第一个参数只能function,后面发现string也能执行.那问题来了,String做 ...

  8. VB6获取IE8的地址栏的URL信息

    这是个老梗了,也没什么技术含量.因为自从接触Linux之后,Windows上我所知道的那一点api基本上都忘光了.所以这样的博文可以当做是备忘,说不定有天还能用的到. Windows上想要获取浏览器的 ...

  9. 适合初学者的一个分布式环境搭建过程(spring boot + zookeeper + dubbo + mybatis + mysql)

    本人也是才开始接触 阿里巴巴的开源分布式框架 dubbo,因为现在微服务框架 spring boot也非常的火,然后结合dubbo的官网搭建这个开发环境. 一.首先 zookeeper作为集群管理服务 ...

  10. Bootstrap选项卡

    前面的话 选项卡Tabs是Web中一种非常常用的功能.用户点击对菜单项,能切换出对应的内容.本文将详细介绍Bootstrap选项卡 基本用法 Bootstrap框架中的选项卡主要有两部分内容组成: 1 ...