洛谷P4397 [JLOI2014]聪明的燕姿
dfs的时候莫名其妙深度太大过不了……然后死活找不出哪里错……
首先,约数和这东西是个积性函数,或者直接点的话就是如果$$n=p_1^{a_1}p_2^{a_2}p_3^{a_3}…p_m^{a_m}$$
那么$n$的约数和就等于$$S=\begin{matrix} \prod_{i=1}^m \end{matrix}\begin{matrix} \sum_{j=0}^{a_i} {p_i}^j \end{matrix}$$
然后因为最近刚学过等比数列求和公式我就把这东西往那方面去想了……然后一直爆零……
实际上只要爆搜就可以了……我太蠢了……
记得dfs的时候如果搜到$S-1$是质数的之后直接乘上去就好了,不用继续搜
- //minamoto
- #include<bits/stdc++.h>
- #define ll long long
- using namespace std;
- const int N=1e5;
- int p[N+],vis[N+],m,st[N<<],top,n,q;
- void init(){
- for(int i=;i<=N;++i){
- if(!vis[i]) p[++m]=i;
- for(int j=;j<=m&&i*p[j]<=N;++j){
- vis[i*p[j]]=;
- if(i%p[j]==) break;
- }
- }
- }
- bool check(int x){
- if(x==) return ;if(x<=N) return !vis[x];
- for(int i=;p[i]*p[i]<=x;++i) if(x%p[i]==) return ;
- return ;
- }
- void dfs(ll now,int x,ll y){
- if(now==) return (void)(st[++top]=y);
- if(now->=p[x]&&check(now-)) st[++top]=y*(now-);
- for(int i=x;1ll*p[i]*p[i]<=now;++i){
- ll tmp=p[i],pp=p[i]+;
- for(;pp<=now;tmp*=p[i],pp+=tmp)
- if(now%pp==) dfs(now/pp,i+,y*tmp);
- }
- }
- int main(){
- // freopen("testdata.in","r",stdin);
- init();
- while(~scanf("%d",&n)){
- top=;
- dfs(n,,);
- sort(st+,st++top);
- printf("%d\n",top);
- for(int i=;i<=top;++i) printf("%d%c",st[i]," \n"[i==top]);
- }
- return ;
- }
洛谷P4397 [JLOI2014]聪明的燕姿的更多相关文章
- 洛谷 P4397 [JLOI2014]聪明的燕姿 / TOPOI 测验1315, 问题E: 1935: 聪明的燕姿 解题报告
题目链接 : 1. 洛谷 2.topoi . 大致题意:输入一个数s,找出所有约数和为s的数 关于一个数的约数和求法: 一个>1的整数可以被分解为多个 质数 的乘方,设数 s = p1k1 * ...
- bzoj3629 / P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...
- P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...
- 【LG4397】[JLOI2014]聪明的燕姿
[LG4397][JLOI2014]聪明的燕姿 题面 洛谷 题解 考虑到约数和函数\(\sigma = \prod (1+p_i+...+p_i^{r_i})\),直接爆搜把所有数搜出来即可. 爆搜过 ...
- BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...
- [JLOI2014]聪明的燕姿(搜索)
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S, ...
- bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...
- 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均为质数, ...
随机推荐
- Linux虚拟机安装学习笔记
一.Linux系统的安装1.VMwaer虚拟机的安装使用 官方下载软件地址:www.vmwaer.com 安装的虚拟机可以与现实的计算机进行通信 安装虚拟主机可以随意定制硬件安装配置建议: CPU:1 ...
- 九度oj 题目1052:找x
题目1052:找x 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9901 解决:5098 题目描述: 输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标 ...
- HDU 4745 最长回文子序列
题目大意 两只青蛙朝不同方向条,每次都到达值相同的位置,不能重复到达自己到过的地方,且不能飞跃已到过的地方 我们可以理解为这两只青蛙分别把整个序列遍历了一遍,依次走过所有的点,找到最多相同的点的个数, ...
- 网络编程进阶:并发编程之协程、IO模型
协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发: 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制 ...
- MyChrome制作Chrome浏览器便携版
Google Chrome官方离线下载地址: https://api.shuax.com/tools/getchrome MyChrome下载地址: http://code.taobao.org/p/ ...
- Educational Codeforces Round 45 (Rated for Div. 2) C、D
C. Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 ...
- Spring Boot实现多个数据源教程收集(待实践)
先收集,后续实践. http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article ...
- python异步回调函数的实现
#coding:utf-8 from socket import * import time #简单的服务器程序 监听用户连接,接收用户发来的信息,并返回反馈 def main(): HOST = & ...
- nodejs连接sqlserver
nodejs连接sqlserver http://blog.csdn.net/kkkkkxiaofei/article/details/31353091
- rk3188调试记录
1.编译 # . build/envsetup.sh # lunch 7 7. PI3910-user 1.电池部分 init.rc启动healthd-charger服务.对电池进行检測 se ...