城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。

可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于 S。

所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。

Solution

分析约数和的式子(1+p1+p1^2+...+p1^a1)*(1+p2+p2^2+...+p2^a2)*...*(1+pk+pk^2+...+pk^ak)。

本题需要输出所有答案,可以猜测答案不是很多。

我们可以枚举所有的p和他们的指数进行搜索。

我们先定p的范围是根号1e5.

但这样会漏掉很多答案。

观察到大与根号的指数次数最多是一。

所以每次搜的时候判一下有没有大质数。

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 100002
  5. #define NN 100000
  6. using namespace std;
  7. typedef long long ll;
  8. int prime[N],vis[N],s,ans,k,st[N],tot;
  9. bool pd(int x){
  10. if(x==) return false;
  11. if(x<=NN) return !vis[x];
  12. for(int i=;i<=tot&&(ll)prime[i]*prime[i]<=x;i++)if(x%prime[i]==) return false;
  13. return true;
  14. }
  15. void dfs(int la,int num,int num1){
  16. if(num==){st[++ans]=num1;return;}
  17. if(num->prime[la]&&pd(num-))st[++ans]=(num-)*num1;
  18. for(int i=la+;i<=tot&&prime[i]*prime[i]<=num;++i)
  19. for(ll j=prime[i],t=prime[i]+;t<=num;j*=prime[i],t+=j){
  20. if(num%t==)dfs(i,num/t,num1*j);
  21. }
  22. }
  23. int main(){
  24. for(int i=;i<=NN;++i){
  25. if(!vis[i])prime[++tot]=i;
  26. for(int j=;j<=tot&&(k=i*prime[j])<=NN;++j){
  27. vis[k]=;
  28. if(i%prime[j]==)break;
  29. }
  30. }
  31. while(scanf("%d",&s)!=EOF){
  32. ans=;
  33. dfs(,s,);
  34. printf("%d\n",ans);
  35. sort(st+,st+ans+);
  36. if(ans){
  37. for(int i=;i<=ans;++i)printf("%d ",st[i]);printf("\n");
  38. }
  39. }
  40. return ;
  41. }
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 100002
  5. #define NN 100000
  6. using namespace std;
  7. typedef long long ll;
  8. int prime[N],vis[N],s,ans,k,st[N],tot;
  9. bool pd(int x){
  10. if(x==) return false;
  11. if(x<=NN) return !vis[x];
  12. for(int i=;i<=tot&&(ll)prime[i]*prime[i]<=x;i++)if(x%prime[i]==) return false;
  13. return true;
  14. }
  15. void dfs(int la,int num,int num1){
  16. if(num==){st[++ans]=num1;return;}
  17. if(num->prime[la]&&pd(num-))st[++ans]=(num-)*num1;
  18. for(int i=la+;i<=tot&&prime[i]*prime[i]<=num;++i)
  19. for(ll j=prime[i],t=prime[i]+;t<=num;j*=prime[i],t+=j){
  20. if(num%t==)dfs(i,num/t,num1*j);
  21. }
  22. }
  23. int main(){
  24. for(int i=;i<=NN;++i){
  25. if(!vis[i])prime[++tot]=i;
  26. for(int j=;j<=tot&&(k=i*prime[j])<=NN;++j){
  27. vis[k]=;
  28. if(i%prime[j]==)break;
  29. }
  30. }
  31. while(scanf("%d",&s)!=EOF){
  32. ans=;
  33. dfs(,s,);
  34. printf("%d\n",ans);
  35. sort(st+,st+ans+);
  36. if(ans){
  37. for(int i=;i<=ans;++i)printf("%d ",st[i]);printf("\n");
  38. }
  39. }
  40. return ;
  41. }

[JLOI2014]聪明的燕姿(搜索)的更多相关文章

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

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

  2. P4397 [JLOI2014]聪明的燕姿

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

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

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

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

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

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

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

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

    传送门 一道神奇的搜索. 直接枚举每个质因数的次数,然后搜索就行了. 显然质因数k次数不超过logkn" role="presentation" style=" ...

  7. bzoj3629[JLOI2014]聪明的燕姿

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

  8. [BZOJ 3629][ JLOI2014 ]聪明的燕姿

    这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...

  9. bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...

随机推荐

  1. ocrosoft 1015 习题1.22 求一元二次方程a*x^2 + b*x + c = 0的根

    http://acm.ocrosoft.com/problem.php?id=1015 题目描述 求一元二次方程a*x2 + b*x + c = 0的根.系数a.b.c为浮点数,其值在运行时由键盘输入 ...

  2. bootstrap 弹窗或者提示框插件 bootstrap-growl 和bootstrap-notify

    Bootstrap简单好用的页面右上角咆哮提示框 - daidaineteasy的专栏 - CSDN博客https://blog.csdn.net/daidaineteasy/article/deta ...

  3. Spark join连接

    内链接

  4. class面向对象-1

    一.基本定义 class cl(object): def __init(self,var) self.var=var def func(self,i) print('%s is in %s'%(i,s ...

  5. windos下完全卸载MySQL

    1.停止mysql服务(win+R,输入:services.msc回车) 2.控制面板卸载MySQL 3.cmd下删除MySQL服务:sc delete MySQL 4.删除目录 (1) C:\Pro ...

  6. Python 构建工具 buildout 的介绍与使用

    来到了新公司上班,首先就是得把自己的环境给搭起来.知乎使用了buildout作为python项目的构建工具. 那么什么是 buildout ? buildout的是一款自动化构建工具.由Zope团队开 ...

  7. 安装使用阿里云的yum源

    CentOS 1.备份(备份本地Yum源) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.下 ...

  8. Gatsby & React & NPX & NVM

    Gatsby & React Gatsby is a blazing fast modern site generator for React. https://www.gatsbyjs.or ...

  9. sql查询表中重复数据个数

    select train_code,count(1) from tb_ask_trainbodyroadtrain group by train_code having count(1) >1

  10. Ftp、Ftps与Sftp之间的区别

    Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...