[JLOI2014]聪明的燕姿(搜索)
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。
可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 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
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #define N 100002
- #define NN 100000
- using namespace std;
- typedef long long ll;
- int prime[N],vis[N],s,ans,k,st[N],tot;
- bool pd(int x){
- if(x==) return false;
- if(x<=NN) return !vis[x];
- for(int i=;i<=tot&&(ll)prime[i]*prime[i]<=x;i++)if(x%prime[i]==) return false;
- return true;
- }
- void dfs(int la,int num,int num1){
- if(num==){st[++ans]=num1;return;}
- if(num->prime[la]&&pd(num-))st[++ans]=(num-)*num1;
- for(int i=la+;i<=tot&&prime[i]*prime[i]<=num;++i)
- for(ll j=prime[i],t=prime[i]+;t<=num;j*=prime[i],t+=j){
- if(num%t==)dfs(i,num/t,num1*j);
- }
- }
- int main(){
- for(int i=;i<=NN;++i){
- if(!vis[i])prime[++tot]=i;
- for(int j=;j<=tot&&(k=i*prime[j])<=NN;++j){
- vis[k]=;
- if(i%prime[j]==)break;
- }
- }
- while(scanf("%d",&s)!=EOF){
- ans=;
- dfs(,s,);
- printf("%d\n",ans);
- sort(st+,st+ans+);
- if(ans){
- for(int i=;i<=ans;++i)printf("%d ",st[i]);printf("\n");
- }
- }
- return ;
- }
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #define N 100002
- #define NN 100000
- using namespace std;
- typedef long long ll;
- int prime[N],vis[N],s,ans,k,st[N],tot;
- bool pd(int x){
- if(x==) return false;
- if(x<=NN) return !vis[x];
- for(int i=;i<=tot&&(ll)prime[i]*prime[i]<=x;i++)if(x%prime[i]==) return false;
- return true;
- }
- void dfs(int la,int num,int num1){
- if(num==){st[++ans]=num1;return;}
- if(num->prime[la]&&pd(num-))st[++ans]=(num-)*num1;
- for(int i=la+;i<=tot&&prime[i]*prime[i]<=num;++i)
- for(ll j=prime[i],t=prime[i]+;t<=num;j*=prime[i],t+=j){
- if(num%t==)dfs(i,num/t,num1*j);
- }
- }
- int main(){
- for(int i=;i<=NN;++i){
- if(!vis[i])prime[++tot]=i;
- for(int j=;j<=tot&&(k=i*prime[j])<=NN;++j){
- vis[k]=;
- if(i%prime[j]==)break;
- }
- }
- while(scanf("%d",&s)!=EOF){
- ans=;
- dfs(,s,);
- printf("%d\n",ans);
- sort(st+,st+ans+);
- if(ans){
- for(int i=;i<=ans;++i)printf("%d ",st[i]);printf("\n");
- }
- }
- return ;
- }
[JLOI2014]聪明的燕姿(搜索)的更多相关文章
- BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...
- P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...
- bzoj3629 / P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...
- 【LG4397】[JLOI2014]聪明的燕姿
[LG4397][JLOI2014]聪明的燕姿 题面 洛谷 题解 考虑到约数和函数\(\sigma = \prod (1+p_i+...+p_i^{r_i})\),直接爆搜把所有数搜出来即可. 爆搜过 ...
- bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...
- 2018.09.11 bzoj3629: [JLOI2014]聪明的燕姿(搜索)
传送门 一道神奇的搜索. 直接枚举每个质因数的次数,然后搜索就行了. 显然质因数k次数不超过logkn" role="presentation" style=" ...
- bzoj3629[JLOI2014]聪明的燕姿
http://www.lydsy.com/JudgeOnline/problem.php?id=3629 搜索. 我们知道: 如果$N=\prod\limits_{i=1}^{m}p_{i}^{k_{ ...
- [BZOJ 3629][ JLOI2014 ]聪明的燕姿
这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...
- bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...
随机推荐
- 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为浮点数,其值在运行时由键盘输入 ...
- bootstrap 弹窗或者提示框插件 bootstrap-growl 和bootstrap-notify
Bootstrap简单好用的页面右上角咆哮提示框 - daidaineteasy的专栏 - CSDN博客https://blog.csdn.net/daidaineteasy/article/deta ...
- Spark join连接
内链接
- class面向对象-1
一.基本定义 class cl(object): def __init(self,var) self.var=var def func(self,i) print('%s is in %s'%(i,s ...
- windos下完全卸载MySQL
1.停止mysql服务(win+R,输入:services.msc回车) 2.控制面板卸载MySQL 3.cmd下删除MySQL服务:sc delete MySQL 4.删除目录 (1) C:\Pro ...
- Python 构建工具 buildout 的介绍与使用
来到了新公司上班,首先就是得把自己的环境给搭起来.知乎使用了buildout作为python项目的构建工具. 那么什么是 buildout ? buildout的是一款自动化构建工具.由Zope团队开 ...
- 安装使用阿里云的yum源
CentOS 1.备份(备份本地Yum源) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.下 ...
- Gatsby & React & NPX & NVM
Gatsby & React Gatsby is a blazing fast modern site generator for React. https://www.gatsbyjs.or ...
- sql查询表中重复数据个数
select train_code,count(1) from tb_ask_trainbodyroadtrain group by train_code having count(1) >1
- Ftp、Ftps与Sftp之间的区别
Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...