zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    打造基于CentOS7的xfce最简工作环境
    Linux下C程序的编辑,编译和运行以及调试
    修正 XE6 TListView 上方 SearchBok 右边的清除钮显示
    TabControl 显示彩色的图示 (XE6 Firemonkey)
    TSwitch 中文简繁显示支持(XE6 Android)
    改变 TMemo 的背景颜色 (Firemonkey)
    修正 XE5 Android 键盘三个问题
    Delphi 收藏
    展示 Popup 的使用方法
    ListView 下拉更新 (支持 Android)
  • 原文地址:https://www.cnblogs.com/yu0111/p/5843358.html
Copyright © 2011-2022 走看看