AcWing1296. 聪明的燕姿
聪明的燕姿
解题思路:
首先我们肯定要用到约数之和定理
但是有个问题就是要怎么用
根据经验得知,约数最多也就六七个左右,不然直接就超了s的范围。所以我们考虑用爆搜来做
但是用爆搜的话还是要优化一下思路和用什么顺序去搜索。
顺序:
按照p和α的顺序来枚举
一旦s%这个当前的乘积==0(dfs的精髓)
那才能跳到下一层循环因为这样才符合约数和定理
dfs的精髓:当前条件满足,然后递归到下一层。到最后一层的时候又满足条件。然后跳出递归
可能要想一些剪枝:
- 当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. 聪明的燕姿的更多相关文章
- BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...
- 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})\),直接爆搜把所有数搜出来即可. 爆搜过 ...
- [补档][JLOI 2017]聪明的燕姿
[NOI 2008]假面舞会 题目 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 ...
- 聪明的燕姿[JLOI2014]
题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ...
- [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_{ ...
随机推荐
- 自己动手写个异步IO函数 --(基于 c# Task)
前言 对于服务端,达到高性能.高扩展离不开异步.对于客户端,函数执行时间是1毫秒还是100毫秒差别不大,没必要为这一点点时间煞费苦心.对于异步,好多人还有误解,如: 异步就是多线程:异步就是如何 ...
- Django模型中的admin后台管理无法显示字段
在执行django后台管理时,登陆到http://127.0.0.1:8000/admin/,进入页面后没有对应的字段显示.请解决? 代码: models.py from django.db impo ...
- Python logging记录日志
Python logging记录日志 调试的几种方法: 使用print()在控制台上输出 使用assert断言 使用logging模块 logging提供了一组便利的函数,用来做简单的日志,(当然也能 ...
- Codeforces_442_A_枚举
http://codeforces.com/problemset/problem/442/A 想想成5*5的图,一共能划10条线,枚举2^10次即可. 判断每种情况是否符合条件的方法,若存在点,被线穿 ...
- HDU 6562 lovers 2018CCPC吉林H(线段树)
题意: 初始n个空串,m个操作: 1.给[l,r]的所有字符串头尾加一个‘d’,将原字符串x变为dxd 2.求[l,r]所有字符串代表的数字之和mod 1e9+7 思路: 据说是硬核线段树.. 对于线 ...
- num12---组合模式
案例描述: 学校下有多个学院,每个学院下有多个专业系. 把学校.院系.专业 全都看成某个组织类型,含有添加add方法,删除remove方法,显示print方法. 如果有新增的院系.专业,新增加对应的 ...
- Qt 中 this->size() this->rect() event->size() 三者差异
测试代码: void OsgEarthGraphicsView::resizeEvent(QResizeEvent* event) { //if (scene()) //{ // scene()-&g ...
- FTP - File Transfer Protocol
FTP - File Transfer Protocol FTP 实际上使用了两个 TCP 链接. 一个作为控制信道用, 主要传输一些指令和响应, 比如 ACK 或 错误码. 另一个链接是数据信道, ...
- 5.7.20 多实例——MGR部署实战
数据库 | MySQL:5.7.20 多实例——MGR部署实战 MGR介绍 基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL ...
- php 安装扩展插件实例-gd库
今天给php 安装一个扩展插件 gd库 一.gd库是什么 gd库是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建图表.图形.缩略图以及其他图像的处理操作. gd库支持 ...