hihoCoder 1298 : 数论五·欧拉函数

#1298 : 数论五·欧拉函数

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥。小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥。

小Hi:小Ho,这次我们选[L,R]中的一个数K。

小Ho:恩,小Hi,这个K是多少啊?

小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件:

假设φ(n)表示1..n-1中与n互质的数的个数。对于[L,R]中的任意一个除K以外的整数y,满足φ(K)≤φ(y)且φ(K)=φ(y)时,K<y。

也即是K是[L,R]中φ(n)最小并且值也最小的数。

小Ho:噫,要我自己算么?

小Hi:没错!

小Ho:好吧,让我想一想啊。

<几分钟之后...>

小Ho:啊,不行了。。感觉好难算啊。

小Hi:没有那么难吧,小Ho你是怎么算的?

小Ho:我从枚举每一个L,R的数i,然后利用辗转相除法去计算[1,i]中和i互质的数的个数。但每计算一个数都要花好长的时间。

小Hi:你这样做的话,时间复杂度就很高了。不妨告诉你一个巧妙的算法吧:

提示:欧拉函数

输入

第1行:2个正整数, L,R,2≤L≤R≤5,000,000。

输出

第1行:1个整数,表示满足要求的数字K

样例输入
 4    6
样例输出
4
/*此题若是直接欧拉的话会时间超限,所以利用筛选素数打表+欧拉
素数筛选打表+欧拉函数
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const LL N=5000002;
int s[N];
void ss(int n)
{
    int i,j;
    for(i=2; i<=n; i++) {
        if(!s[i])
            for(j=i; j<=n; j+=i) {
                if(!s[j])
                    s[j]=j;
                /*筛选的时候就把对应的欧拉函数求出来*/
                s[j]=s[j]/i*(i-1);
            }
    }
}
int main()
{
    int l,r;
    cin>>l>>r;
    ss(r);
    int ans=l,m=s[l];
    for(int i=l+1; i<=r; i++) {
        if(s[i]<m) {
            m=s[ans=i];
        }
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-08-05 11:18:17

hihoCoder 1298 : 数论五·欧拉函数的相关文章

数论五&#183;欧拉函数

#1298 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数

hihoCoder 数论五&#183;欧拉函数

题目1 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数的个

「POJ3696」The Luckiest number【数论,欧拉函数】

# 题解 一道数论欧拉函数和欧拉定理的入门好题. 虽然我提交的时候POJ炸掉了,但是在hdu里面A掉了,应该是一样的吧. 首先我们需要求的这个数一定可以表示成\(\frac{(10^x-1)}{9}\times 8\). 那么可以列出一个下面的方程 \[\frac{(10^x-1)}{9}\times 8=L\times k\] 设\(d=gcd(9L,8)=gcd(L,8)\) \[\frac89(10^x-1)=Lk\] \[\frac{8(10^x-1)}d=\frac{9Lk}{d}\]

【SGU】SGU每日练1&#183;Coprimes【数论】欧拉函数

先介绍欧拉函数及其相关定理吧: 1.欧拉函数:对于任意一个数X,将其分解质因数为X=(P1^b1)*(P2^b2)*(P3^b3)...... 则小于X的与X互质的数的个数N为N = X * (1 - 1 / p1) * (1 - 1 / p2)....... 显然对于质数p,Euler(p) = p - 1: 2.一个数的所有质因子之和是euler(n)*n/2: 3.a^Euler(n) % n = 1,这里可以用模运算来证明: 具体实现: 1.先筛素数 2.从2开始遍历素数,能整除则乘,然

[BZOJ2818] Gcd (数论,欧拉函数,线性筛)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 必须用线性筛. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn = 10001001; 5 LL phi[maxn], sum[maxn], n; 6 bool isprime[maxn]; 7 LL prime[maxn]; 8 int tot;

数论8——欧拉函数

欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数目 辣么,怎么求哩?~(-o ̄▽ ̄)-o 可以先在1到n-1中找到与n不互质的数,然后把他们减掉 比如φ(12) 把12质因数分解,12=2*2*3,其实就是得到了2和3两个质因数 然后把2的倍数和3的倍数都删掉 2的倍数:2,4,6,8,10,12 3的倍数:3,6,9,12 本来想直接用12 - 12/2 - 12/3 但是6和12重复减了 所以还要把即是2的倍数又是3的倍数的数加回来 (>﹏<) 所以这样写12 - 1

【数论】欧拉函数

欧拉函数φ      欧拉定理是用来阐述素数模下,指数同余的性质.      欧拉定理:对于正整数N,代表小于等于N的与N互质的数的个数,记作φ(N)      例如φ(8)=4,因为与8互质且小于等于8的正整数有4个,它们是:1,3,5,7     欧拉定理还有几个引理,具体如下:     ①:如果n为某一个素数p,则φ(p)=p-1;     ①很好证明:因为素数p的质因数只有1和它本身,p和p不为互质,所以φ(p)=p-1:     ②:如果n为某一个素数p的幂次,那么φ(p^a)=(p-

CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)

这题我在考场上也是想出了正解的……但是没调出来. 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值. $1\le n\le 4\times 10^5,1\le q\le 2\times 10^5,1\le a_i,x\le 300$.时限 5.5s,空限 256MB. 明显线段树. 有一个想法是维护区间积的欧拉函数,但是这样时间复杂度和代码复杂度都很高…… 我的做法是维护区间积.而欧拉函数,就是看看

hdoj 1286 找新朋友 【数论之欧拉函数】

找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7912    Accepted Submission(s): 4157 Problem Description 新年快到了,"猪头帮协会"准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大