Link

  https://jzoj.net/senior/#main/show/3760

Description

  欧拉函数  φ(n)  定义为不超过正整数 n 并且与 n 互素的整数的数目。
  可以证明 φ(n) =  n ∗ ∏ (1 − 1 / pi). 其中 pi(1 <= i <= k)是 n 的全部素因子。
  已知 y,求最小的自然数 x 使得 φ(x) = y.
  多组询问。

Solution

30分:

  可以枚举每一个x,判断所得出来的φ(x)是否等于y。可证x≤7y

60分:

  可能是某些神奇的算法,或者是给没有int64的人一点分

100分:

  这里有三种解题思路

  三种都可以用搜索来做,也可以使用动态规划来做。

  动态规划公式:F[i,j]表示前i个可能的质因子,分解后得到状态S的最小x’

(1)欧拉函数定义

  根据欧拉函数的定义,很显然可以得到如下两条性质:

  ①φ(x)=x-1......................当x是素数时

  ②φ(xy)=φ(x)*φ(y)..........对任何情况都是成立的

  于是,分别得出如下结论:

    根据①:x的质因数可能是y的约数加一,

    根据②:x的质因数可能是y的质因数。

  可能有点难理解,但的确如此。

(2)分解欧拉函数公式

  我们可以尝试一下分解每个式子。

  x=p1q1*p2q2*...pnqk(p数组为x质因子,q数组为每个质因子的个数)

  显然如下

  φ(x)=x*(p1-1/p1)(p2-1/p2).....(pk-1/pk)..................................公式

  φ(x)=p1q1*p2q2*...pn^qn*(p1-1/p1)(p2-1/p2).....(pk-1/pk).......将x带入

  当q1=q2=....=qk=1时,剩下的,就只有(p1-1)*(p2-1)*...(pk-1)

  当有某些q数组的元素大于一时,就是上面那些式子,再多乘那些消掉以后多出来的pxqx,即(p1-1)*(p2-1)*...(pk-1)*pxqx,注意,这里x只是某一个举例子的

  所以可以发现,x的质因数可能是y的约数加一,x的质因数可能是y的质因数。

(3)分解欧拉函数公式

  同样是拆分式子,跟(2)差不多的,

  φ(x)=∏piqi * ∏(1-1/pi)

  φ(x)=∏[ piqi (1-1/pi) ]............合并连乘的

  φ(x)=∏[ piqi-1 (1-1/pi)*pi ]...拆一个pi出来与后面的式子相乘

  φ(x)=∏[ piqi-1 (pi-1) .............约分得到的

  同样可以得到上面的结论(x的质因数可能是y的约数加一,x的质因数可能是y的质因数),递归或者动态规划做就行了

剪枝

  可以加快排,大小值,记忆化来剪枝。

Code(2)

uses math;
var
x,min:int64;
n,t,i,j,k:longint;
prime,bz:array[..] of int64;
procedure dg(k,x,now:int64);
var
s,ss:qword;
i:longint;
begin
if now>min then
exit; if x= then
begin
min:=now; exit;
end; if k>prime[] then
exit; s:=;
for i:= to do
begin
if s>x then
break; if s>x/prime[k] then
break; if x mod (s*prime[k])<> then
break; bz[k]:=i;
dg(k+,x div (s*prime[k]),now*s*(prime[k]+));
bz[k]:=-; s:=s*(prime[k]+);
end; dg(k+,x,now);
end;
function pd(x:int64):boolean;
var
i:longint;
begin
for i:= to trunc(sqrt(x)) do
if x mod i= then
exit(false); exit(true);
end; procedure q(l,r:longint);
var
t,mid:int64;
i,j:longint;
begin
i:=l;
j:=r;
mid:=prime[(l+r) shr ]; while i<j do
begin
while prime[i]>mid do inc(i);
while prime[j]<mid do dec(j); if i<=j then
begin
t:=prime[i]; prime[i]:=prime[j]; prime[j]:=t; inc(i); dec(j);
end;
end; if i<r then q(i,r);
if l<j then q(l,j);
end;
begin
readln(n);
for j:= to n do
begin
readln(x); fillchar(prime,sizeof(prime),);
for i:= to trunc(sqrt(x)) do
if x mod i= then
begin
if pd(i+) then
begin
inc(prime[]); prime[prime[]]:=i;
end; if x div i<>i then
begin
if pd(x div i+) then
begin
inc(prime[]); prime[prime[]]:=x div i;
end;
end;
end; q(,prime[]); fillchar(bz,sizeof(bz),); min:=;
dg(,x,);
writeln(min);
end;
end.
uses math;
const maxn=;
var
pr,flag:array[..] of int64;
z,have:array[..] of int64;
bz:array[..] of boolean;
n,nn,tot,ans:int64;
i,j,p:longint;
procedure dfs(k,sum,max:int64; flag2:boolean);
begin
if max*sum>=ans then exit;
if sum= then
begin
ans:=min(ans,max);
exit;
end;
if k>have[]+pr[] then exit; if k<=have[] then
begin
if (have[k]<=) or (sum mod have[k]<>) then dfs(k+,sum,max,flag2) else
begin
dfs(k+,sum div have[k],max*(have[k]+),true);
dfs(k+,sum,max,flag2);
end;
end
else
begin
if flag2 then exit; inc(flag[have[k]]);
if flag[have[k]]= then begin if sum mod (have[k]-)= then dfs(k+,sum div (have[k]-),max*have[k],flag2); end
else
if sum mod have[k]= then dfs(k+,sum div have[k],max*have[k],flag2);
dec(flag[have[k]]); dfs(k+,sum,max,flag2);
end;
end;
function pd(x:int64):boolean;
begin
for j:= to z[] do
begin
if sqr(z[j])>x then exit(true);
if x mod z[j]= then exit(false);
end;
end;
begin
for i:= to maxn do
begin
if not bz[i] then
begin
inc(z[]);
z[z[]]:=i;
end;
for j:= to z[] do
begin
if z[j]*i>maxn then break;
bz[z[j]*i]:=true;
if i mod z[j]= then break;
end;
end; readln(tot);
for p:= to tot do
begin
have[]:=;
pr[]:=;
readln(n);
for i:=trunc(sqrt(n)) downto do
if n mod i= then
begin
if pd(i+) then begin inc(have[]); have[have[]]:=i; end;
if i=n div i then continue;
if pd(n div i+) then begin inc(have[]); have[have[]]:=n div i; end;
end;
nn:=n;
for i:= to z[] do
begin
if sqr(z[i])>nn then break;
if nn mod z[i]= then begin inc(pr[]); have[pr[]+have[]]:=z[i]; end;
while nn mod z[i]= do
begin
inc(pr[]);
have[pr[]+have[]]:=z[i];
nn:=nn div z[i];
end;
end; ans:=maxlongint*maxlongint;
dfs(,n,,false);
writeln(ans);
end;
end.

[jzoj]3760.【BJOI2014】Euler的更多相关文章

  1. jzoj3760. 【BJOI2014】Euler

    题目大意: 欧拉函数  φ(n)  定义为不超过正整数 n 并且与 n 互素的整数的数目. 可以证明 φ(n) =  n ∗ ∏ (1 − 1 / pi). 其中 pi(1 <= i <= ...

  2. 【CF1053E】Euler tour

    [CF1053E]Euler tour 题面 CF 洛谷 大概意思是你有一棵树,然而你并不知道这棵树是啥.给你一个确定了一些位置的欧拉序(就是\(ST\)表求\(LCA\)的那个序列),问你是否存在一 ...

  3. JZOJ 3223. 【HBOI2013】Ede的新背包问题

    3223. [HBOI2013]Ede的新背包问题 (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Detailed Lim ...

  4. JZOJ 2137. 【GDKOI2004】城市统计 (Standard IO)

    2137. [GDKOI2004]城市统计 (Standard IO) Time Limits: 1000 ms  Memory Limits: 128000 KB  Detailed Limits  ...

  5. JZOJ 2136. 【GDKOI2004】汉诺塔

    2136. [GDKOI2004]汉诺塔 (Standard IO) Time Limits: 3000 ms  Memory Limits: 128000 KB  Detailed Limits   ...

  6. JZOJ 1154. 【GDOI2003】购物

    1154. [GDOI2003]购物 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description GDOI商场推出优惠 ...

  7. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  8. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  9. JZOJ 1667【AHOI2009】中国象棋——dp

    题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...

随机推荐

  1. linux基础练习题(1)

    Linux命令作业(关卡一) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 简述什么是OS 简述应用程序.硬件.OS的关系 列举出3种常见的操作系统 简述Ubuntu和Linux的关系 ...

  2. GAN-生成手写数字-Keras

    from keras.models import Sequential from keras.layers import Dense from keras.layers import Reshape ...

  3. vue Bus总线

    有时候两个组件也需要通信(非父子关系).当然Vue2.0提供了Vuex,但在简单的场景下,可以使用一个空的Vue实例作为中央事件总线. 参考:http://blog.csdn.net/u0130340 ...

  4. Quartz.NET(任务调度)与Topshelf(服务)的综合使用

    http://www.cnblogs.com/jys509/p/4628926.html http://cron.qqe2.com/ Quartz_Topshlf_Demo.7z

  5. Redis的搭建和Redis的集群搭建

    1.Redis的官网:https://redis.io/      Redis的测试网站:http://try.redis.io/ 2.参考博客:https://www.cnblogs.com/maf ...

  6. jQuery数字滚动(模拟网站人气、访问量递增)原创

    插件描述:实现数字上下滚动,模拟网站人气.访问量递增的动画效果,兼容性如下: 使用方法 $(el).runNum(val,params);   参数详解 val:数值型(默认70225800): pa ...

  7. 借用nginx.vim工具进行语法高亮和格式化配置nginx.conf文件

    在生产环境中,我们肯定经常用到nginx.conf文件的编排工作,今天在阅读<决战nginx>的时候无意间看到nginx.vim这个辅助工具,于是百度搜索和实际部署检测了一下,其效果确实让 ...

  8. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  9. Java中常见的排序方式-选择排序(升序)

    [基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[0]和a ...

  10. Java基础总结02:环境变量的配置

    (一)Windows系统下配置环境变量 ※在"系统变量"中设置3项属性JAVA_HOME.PATH.CLASSPATH(JDK1.5之后此项属性不必再配),若已存在则点击" ...