【BZOJ4803】逆欧拉函数
【BZOJ4803】逆欧拉函数
题面
题解
题目是给定你\(\varphi(n)\)要求前\(k\)小的\(n\)。
设\(n=\prod_{i=1}^k{p_i}^{c_i}\)
则\(\varphi(n)=\prod_{i=1}^k{p_i}^{c_i-1}(p_i-1)\)
然后我们猜一下这个\(n\)不是很多,事实上\(n\)不超过\(50w\)个。
考虑暴力\(dfs\)出所有的\(n\):
首先筛出\(\sqrt{\varphi(n)}\)内的素数
对于当前\(dfs\)的值\(phi\)
看\(phi\)中的约数有没有\(筛出的素数-1\)
若有,假设该素数为\(p\)
去除\(phi\)中的所有\(p\),之后再将\(dfs\)的\(n\)累乘上\(p\)
在每一次递归开头用\(miller\)_\(Rabin\)判断\(phi+1\)是否为素数,如果是,则直接加进答案就行了
想一想,为什么?
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <ctime>
using namespace std;
typedef long long ll;
const int MAX_N = 1e7 + 5;
const int T = 10;
bool is_prime[MAX_N];
int prime[MAX_N], num, K;
ll N = 1e7, ans[MAX_N], cnt_ans;
void sieve() {
for (int i = 1; i <= N; i++) is_prime[i] = 1;
is_prime[1] = 0;
for (int i = 2; i <= N; i++) {
if (is_prime[i]) prime[++num] = i;
for (int j = 1; prime[j] * i <= N && j <= num; j++) {
is_prime[i * prime[j]] = 0;
if (!(i % prime[j])) break;
}
}
}
ll fmul(ll x, ll y, ll Mod) {
ll res = 0;
while (y) {
if (y & 1ll) res = (res + x) % Mod;
y >>= 1ll;
x = (x + x) % Mod;
}
return res;
}
ll fpow(ll x, ll y, ll Mod) {
ll res = 1;
while (y) {
if (y & 1ll) res = fmul(res, x, Mod);
y >>= 1ll;
x = fmul(x, x, Mod);
}
return res;
}
bool Test(ll a, ll n) {
ll r = 0, t = n - 1, m;
while ((t & 1ll) == 0) ++r, t >>= 1ll;
m = (n - 1) / (1ll << r);
for (int i = 0; i < r; i++) if (fpow(a, (1ll << i) * m, n) == n - 1) return 1;
if (fpow(a, m, n) == 1) return 1;
return 0;
}
bool Miller_Rabin(ll n) {
if (n == 2ll) return 1;
if (n < 2ll || ((n & 1ll) == 0)) return 0;
for (int i = 1; i <= T; i++) {
ll a = rand() % (n - 2) + 2;
if (fpow(a, n - 1, n) != 1) return 0;
if (!Test(a, n)) return 0;
}
return 1;
}
void solve(ll phi, ll n, int lst) {
if (phi + 1 > prime[num] && Miller_Rabin(phi + 1))
ans[++cnt_ans] = n * (phi + 1);
for (int i = lst; i; i--) {
if (!(phi % (prime[i] - 1))) {
ll t1 = phi / (prime[i] - 1), t2 = n, t3 = 1ll;
while (!(t1 % t3)) {
t2 *= prime[i];
solve(t1 / t3, t2, i - 1);
t3 *= prime[i];
}
}
}
if (phi == 1ll) ans[++cnt_ans] = n;
}
int main () {
srand(time(NULL));
sieve();
cin >> N >> K;
solve(N, 1ll, num);
sort(&ans[1], &ans[cnt_ans + 1]);
for (int i = 1; i < K; i++) printf("%lld ", ans[i]);
printf("%lld\n", ans[K]);
return 0;
}
【BZOJ4803】逆欧拉函数的更多相关文章
- 求逆欧拉函数(arc)
已知欧拉函数计算公式 初始公式:φ(n)=n*(1-1/p1)*(1-1/p2).....*(1-1/pm) 又 n=p1^a1*p2^a2*...*ps^as 欧拉函数是积性函数 那么:φ(n ...
- now code——小a和黄金街道(欧拉函数和快速幂模板)
小a和小b来到了一条布满了黄金的街道上.它们想要带几块黄金回去,然而这里的城管担心他们拿走的太多,于是要求小a和小b通过做一个游戏来决定最后得到的黄金的数量.游戏规则是这样的:假设道路长度为米(左端点 ...
- UVA10200-Prime Time/HDU2161-Primes,例题讲解,牛逼的费马小定理和欧拉函数判素数。
10200 - Prime Time 此题极坑(本菜太弱),鉴定完毕,9遍过. 题意:很简单的求一个区间 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- COGS2531. [HZOI 2016]函数的美 打表+欧拉函数
题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...
- poj2478 Farey Sequence (欧拉函数)
Farey Sequence 题意:给定一个数n,求在[1,n]这个范围内两两互质的数的个数.(转化为给定一个数n,比n小且与n互质的数的个数) 知识点: 欧拉函数: 普通求法: int Euler( ...
- 51Nod-1136 欧拉函数
51Nod: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136 1136 欧拉函数 基准时间限制:1 秒 空间限制: ...
随机推荐
- swift动态库与use_frameworks
使用Dynamic 的优势: 模块化,相对于Static Library,Framework可以将模块中的函数代码外的资源文件打包在一起. 共享可执行文件 iOS 有沙箱机制,不能跨App间共享共态库 ...
- 简析Chrome和Webkit的渊源
http://www.3lian.com/edu/2012/05-25/28803.html 互联网的浪潮从未停息,而用以网上冲浪的冲浪板也一直在变得愈加精良.自人们进入互联网时代以来,即已经发生了三 ...
- WEB安全 asp+access注入
asp+access注入 数据库 (access数据库没有数据库名) 表名 字段(列名) 记录(行,内容) 注入常用函数: top n 表示查询结果的第n个记录 len() 函数返回文本字段中值的长度 ...
- css实现等高布局 两栏自适应布局 三栏自适应布局
等高布局: HTML结构如下: <div class="wrapper"> <div class="box"> <h1>.. ...
- Selenium自动化测试之启动浏览器
Selenium自动化测试之启动浏览器 一.Eclipse新建java工程 1.新建java工程:File->New->Java Project,输入Project name:如AutoT ...
- Intellij IDEA 2018.2.2 SpringBoot热启动 (Maven)
一.IDEA 工具配置 1. 打开IDEA 设置界面,选择编译,按图打勾. 2 . 然后 Shift+Ctrl+Alt+/,选择Registry 3 . compiler.automake.allow ...
- Weex 环境搭建 (一)
1 安装Node.js 去Node.js 官网 https://nodejs.org/ 下载安装文件安装. 安装好后,根据如下命令检查是否安装正常. 在windows 环境下,开始-运行 ...
- 去掉C#中Guid.NewGuid().ToString()自动生成的短横线
别人设计的ID类型为varchar(32),使用Guid.NewGuid().ToString()自动生成ID值,本来大小32位妥妥的.可C#在生成的ID值中自动生成了几根小横杠,你说是不是讨嫌. 岂 ...
- 【原创】如何使用Jmockit进行单元测试
如何使用jmockit进行单元测试 1. Jmockit简介 JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrume ...
- Java中的冒泡排序
Java中的冒泡排序排序的第一种思想:将第一个值与后面的值相比较,如果第一个值比其他值小,那么将较大的值与第一个换位置,然后继续比较直至所有的数比较完成.这样就可以保证第一个数是最大数.然后将第二个数 ...