聪明的燕姿

解题思路:

首先我们肯定要用到约数之和定理

但是有个问题就是要怎么用

根据经验得知,约数最多也就六七个左右,不然直接就超了s的范围。所以我们考虑用爆搜来做

但是用爆搜的话还是要优化一下思路和用什么顺序去搜索。

顺序:

按照p和α的顺序来枚举

一旦s%这个当前的乘积==0(dfs的精髓)

那才能跳到下一层循环因为这样才符合约数和定理

dfs的精髓:当前条件满足,然后递归到下一层。到最后一层的时候又满足条件。然后跳出递归

可能要想一些剪枝:

  1. 当s等于1+p的时候,直接就得到一个答案。这样就可以少遍历几个

小于s的质数的个数有s除以logn个

时间复杂度:\(O(10\sqrt{S}*100)\)

十个约数,然后再判断质数的个数。k组数据

y总的代码

#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int N = 50000; int primes[N], cnt;
bool st[N]; int ans[N], len; void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] * i <= n; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
} bool is_prime(int x)
{
if (x < N) return !st[x];
for (int i = 0; primes[i] <= x / primes[i]; i ++ )
if (x % primes[i] == 0)
return false;
return true;
} void dfs(int last, int prod, int s)
{
if (s == 1)
{
ans[len ++ ] = prod;
return;
} if (s - 1 > (last < 0 ? 1 : primes[last]) && is_prime(s - 1))
ans[len ++ ] = prod * (s - 1); // 不可以写primes[last]因为可能是第一个 for (int i = last + 1; primes[i] <= s / primes[i]; i ++ )
{
int p = primes[i];
for (int j = 1 + p, t = p; j <= s; t *= p, j += t)
if (s % j == 0)
dfs(i, prod * t, s / j);
}
} int main()
{
get_primes(N - 1); int s;
while (cin >> s)
{
len = 0;
dfs(-1, 1, s); cout << len << endl;
if (len)
{
sort(ans, ans + len);
for (int i = 0; i < len; i ++ ) cout << ans[i] << ' ';
cout << endl;
}
} return 0;
}

解题技巧创造出来

算法创造出来比较少

自己的代码

#include<cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 50000 + 10;
int ans[maxn], len, cnt;
int primes[maxn];
bool st[maxn]; void get_primes(int n)
{
for(int i = 2; i <= n; i++) // 求约数不能折半
{
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] * i <= n ; j ++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
} bool is_prime(int n)
{
if(n < maxn) return !st[n];
for(int i = 0; primes[i] <= n / primes[i]; i++)
{
if(n % primes[i] == 0) return false;
}
return true;
} void dfs(int last, int prod, int s)
{
if(s == 1)
{
ans[len++] = prod;
return ;
}
if(is_prime(s - 1) && s - 1 > (last < 0 ? 1 : primes[last])) ans[len++] = prod * (s - 1); // primes[last + 1]的话可能会出错
for(int i = last + 1; primes[i] <= s / primes[i]; i++)
{
int p = primes[i];
for(int j = 1 + p, t = p; j <= s; t*=p, j += t)
{
if(s % j == 0) dfs(i, prod * t, s / j);
}
}
} int main()
{
get_primes(maxn);
int s;
while(~scanf("%d", &s))
{
len = 0;
dfs(-1, 1, s);
cout << len << endl;
if(len)
{
sort(ans, ans + len);
for(int i = 0; i < len ; i++) printf("%d ", ans[i]);
printf("\n");
}
}
return 0;
}

AcWing1296. 聪明的燕姿的更多相关文章

  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. [补档][JLOI 2017]聪明的燕姿

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

  6. 聪明的燕姿[JLOI2014]

    题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ...

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

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

  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. 7.场景5:使用Linux桥的VRRP(L3HA)的高可用性

    此场景描述了使用ML2插件和Linux网桥的OpenStack网络服务的高可用性实现. 他的高可用性实施例增强了这样的场景:具有Linux网桥架构的传统使用了keepalived的虚拟路由器冗余协议( ...

  2. Python趣味入门01:你真的了解Python么?

    小牛叔倾情出品,史上更简单有趣的Python入门系列教程,用认真.上心的原创带你飞. 0.Why Python ? 什么入门用python,其实这和它的气质有关,根据CHM(计算机历史博物馆)网站介绍 ...

  3. POJ_1979_dfs

    题目描述: 每组数据给你一张字符的图,'@'代表起点,'.'代表可走的路,'#'代表墙,求从起点出发,可到达的位置的数量,包括起点. 思路: dfs基础题,从起始点开始,每一次所在的点,只要不出界并且 ...

  4. Android Studio 学习笔记(三):简单控件及实例

    控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...

  5. Go语言实现:【剑指offer】数组中重复的数字

    该题目来源于牛客网<剑指offer>专题. 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组 ...

  6. json-server的简单使用

    json-server是一个在前端本地运行,可以存储json数据的server(服务器),该服务器只支持 get 方法获取,不支持 post 方法获取,使用express工具可以使用post方法. V ...

  7. 20191225--python学习第二天笔记(补)

    1.内容回顾 学习计算机基础 安装解释器 2.语法 print/input 整型 int/字符串 str/布尔类型 boolen 条件语句 and运算符 变量 3.练习 评分规则:用户输入成绩,根据成 ...

  8. 使用GitHub+Travis-CI+Docker打造自动化流水线

    全文采用的是阿里云的ESC服务器,系统是CentOS 7 示例项目是NodeJS编写,本文主要是Docker的使用,在文章前2/3都是Docker命令介绍,最后我们会完成一个自动化的示例. 准备 注册 ...

  9. ELF文件之一——

    ELF文件整体布局 下图是后来例子中main.o和main.elf的布局. 其中,只有elf header的位置是固定的,固定在文件开始,其它部分的位置都不确定. 比如下面的main.o布局中,.te ...

  10. Vue开发中的常用技巧(持续更新)

    1. 监听子组件的生命周期例如有父组件Parent和子组件Child,如果父组件监听到子组件挂载mounted就做一些逻辑处理,常规写法可能如下: // Parent.vue <Child @m ...