逆欧拉函数(arc)
题目描述:
已知phi(N),求N。
输入说明:
两个正整数,分别表示phi(N)和K。
输出说明:
按升序输出满足条件的最小的K个N。
样例输入:
8 4
杨丽输出:
15 16 20 24
数据范围:
对于20%的数据 phi(N)<=100
对于40%的数据 phi(N)<=10^5
对于80%的数据 phi(N)<=10^9
对于100%的数据 phi(N)<=10^14,K<=1000
其中有60%的数据满足K=1
输入数据保证符合题意,且满足答案中最大的数不超过10^14。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
#define ll long long
using namespace std;
const ll N=1e7;
const ll M=1e5+;
ll n,k,tot,prime[N/],ans[M];
bool check[N+];
void prepare()
{
ll x=min(N,n*);
for(ll i=,t;i<=x;i++)
{
if(!check[i]) prime[++tot]=i;
for(ll j=;j<=tot&&(t=prime[j]*i)<=x;j++)
{
check[t]=;
if(i%prime[j]==) break;
}
}
}
ll mul(ll x,ll y,ll z)
{
ll r=;
for(;y;x<<=,x%=z,y>>=)
{
if(y&)
r+=x,r%=z,y--;
}
}
ll Qc(ll x,ll y,ll z)
{
ll r=;
for(;y;x<<=,x%=z,y>>=)
if(y&)
r=mul(r,x,z);
return r;
}
bool is_prime(ll n)
{
if(n<) return ;
if(n==) return ;
if(!(n&)) return ;
ll m=n-,j=;
for(;!(m%);j++,m>>=);
for(ll a,x,y,i=;i<=;i++)
{
a=rand()%(n-)+;
x=Qc(a,m,n);
for(ll k=;k<=j;k++){
y=mul(x,x,n);
if(y==&&x!=&&x!=n-) return ;
x=y;
}
if(x!=) return ;
}
return ;
}
void dfs(ll x,ll y,ll z)
{
if(x==)
{
ans[++ans[]]=y;return;
}
if(z<=) return;
if(x+>prime[tot]&&is_prime(x+)) ans[++ans[]]=y*(x+);
for(ll a,b,c,i=z;i;i--)
{
if(x%(prime[i]-)==)
{
a=x/(prime[i]-);b=y;c=;
while(a%c==)
{
b*=prime[i];
dfs(a/c,b,i-);
c*=prime[i];
}
}
}
}
int main()
{
srand(time());
scanf("%I64d%I64d",&n,&k);
prepare();
dfs(n,,tot);
sort(ans+,ans+ans[]+);
for(int i=;i<=k;i++)
printf("I64d ",ans[i]);
return ;
}

思路:

算法一

暴力枚举N,暴力求出phi(N)验证答案。

时间复杂度:O(N^1.5)或O(N^2logN)或O(N^(5/4)logN)

期望得分:20-50

算法二

在算法一的基础上,求phi用欧拉线性筛法。

时间复杂度:O(N)

期望得分:50

算法三

考虑到原数只可能有一个大于10^7的质因子。考虑将phi(N)分解,在10^7范围内从大到小暴力搜索质因子试除(从大到小搜索可使状态树上紧下宽),并记录对应的N。一个明显的优化就是如果当前数加一为大于10^7的一个质数(用Miller-Rabin素性测试判)就可以停止这一状态的继续搜索了。虽然看起来复杂度很吓人,不过由于满足条件的N较少等等种种原因,实测还是相当快的。

时间复杂度:O(?)

期望得分:100

济南学习 Day 5 T2 pm的更多相关文章

  1. 济南学习 Day 3 T2 pm

    LYK 快跑!(run)Time Limit:5000ms Memory Limit:64MB题目描述LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在(n, ...

  2. 济南学习 Day 2 T2 pm

    她[问题描述]给你L,R,S,M,求满足L≤ (S × x) mod M ≤ R最小的正整数 X.[输入格式]第一行一个数T代表数据组数.接下来一行每行四个数代表该组数据的L,R,S,M.[输出格式] ...

  3. 济南学习 Day 5 T1 pm

    欧拉函数(phi)题目描述: 已知(N),求phi(N). 输入说明: 正整数N. 输出说明: 输出phi(N). 样例输入: 8 样例输出: 4 数据范围: 对于20%的数据,N<=10^5 ...

  4. 济南学习 Day 4 T1 pm

    幸运数字(number)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近运气很差,例如在 NOIP 初赛中仅仅考了 90 分,刚刚卡进复赛,于是它决定使用一些 ...

  5. 济南学习 Day 4 T2 am

    LYK 与实验室(lab)Time Limit:5000ms Memory Limit:64MB题目描述LYK 在一幢大楼里,这幢大楼共有 n 层,LYK 初始时在第 a 层上.这幢大楼有一个秘密实验 ...

  6. 济南学习 Day 3 T3 pm

    仙人掌(cactus)Time Limit:1000ms Memory Limit:64MB题目描述LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果. ...

  7. 济南学习 Day 3 T1 pm

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克 ...

  8. 济南学习 Day 3 T2 am

    看程序写结果(program)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地在 ...

  9. 济南学习 Day 2 T3 pm

    它[问题描述]N个人坐成一圈,其中第K个人拿着一个球.每次每个人会以一定的概率向左边的人和右边的人传球.当所有人都拿到过球之后,最后一个拿到球的人即为胜者.求第N个人获胜的概率. (所有人按照编号逆时 ...

随机推荐

  1. (五)使用Docker镜像(上)

    1. 获取镜像 # 获取镜像 docker pull image:tag // 不使用tag 默认下载latest标签的镜像,即最新的镜像. 2. 查看镜像信息 # 查看镜像信息docker imag ...

  2. var、let、const声明变量的区别

    let和var声明变量的区别:1.let所声明的变量只在let命令所在的代码块内有效.(块级作用域) for(let i=0;i<10;i++){ // ... } console.log(i) ...

  3. Arch Linux 天坑

    https://wiki.archlinux.org/index.php/Samba_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) samba  gui客户端 smb4 ...

  4. 洛谷 P1120 小木棍[数据加强版]

    这道题可能是我做过的数据最不水的一道题-- 题目传送门 这题可以说是神剪枝,本身搜索并不算难,但剪枝是真不好想(好吧,我承认我看了题解)-- 剪枝: 用桶来存储木棍 在输入的时候记录下最长的木棍和最短 ...

  5. javascript的offset、client、scroll使用方法

    offsetTop 指元素距离上方或上层控件的位置,整型,单位像素. offsetLeft 指元素距离左方或上层控件的位置,整型,单位像素. offsetWidth 指元素控件自身的宽度,整型,单位像 ...

  6. shell脚本,提取ip地址和子网掩码,和查外网ip地址信息。

        #提取IP地址和子网掩码 [root@localhost ~]# ifconfig eth0|grep 'inet addr'|awk -F'[ :]+' '{print $4"/& ...

  7. 使用Fiddler抓取Android模拟器中的Android_APP请求

    对Fiddler的设置:在https://www.telerik.com/download/fiddler网站上下载Fiddler,输入内容后点击下面按钮进行下载: 下载成功后,打开Fiddler进行 ...

  8. Zookeeper 集群 BindException: Cannot assign requested address 解决方案

    前言 经历: 最近在搭建zookeeper集群,基础是3台机器(尝试过ubuntu 17 和 Centos 7). 一开始选择的是3台腾讯云服务器,每台机器在java环境配置正确的情况下,单机的情况都 ...

  9. inotify+rsync sersync+rsync实时同步服务

    中小型网站搭建-数据实时的复制-inotify/sersync inotify是一种强大的,细粒度的.异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入inotify支持,通过i ...

  10. python:post请求业务、调用微信api监控业务

    vim post.py #!/usr/bin/env python # -*- coding: utf-8 -*- import json import os import datetime impo ...