UVa 11440 - Help Tomisu(欧拉函数 + 问题转换)

Posted hkxy125

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 11440 - Help Tomisu(欧拉函数 + 问题转换)相关的知识,希望对你有一定的参考价值。

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2435

 

题意:

给定正整数N和M,统计2和N!之间有多少个整数x满足:x的所有素因子都大于M(2≤N≤1e7,1≤M≤N,N-M≤1e5)。
输出答案除以100000007的余数。例如,N=100,M=10时答案为43274465。

 

分析:

因为M≤N,所以N!是M!的整数倍。“所有素因子都大于M”等价于和M!互素。
另外,根据最大公约数的性质,对于k>M!,k与M!互素当且仅当k mod M!与M!互素。
这样,只需要求出“不超过M!且与M!互素的正整数个数”,再乘以N!/M!即可。
这样,问题的关键就是求出phi(M!)。因为有多组数据,考虑用递推的方法求出所有的phifac(n)=phi(n!)。
由phi函数的公式:phi(n) = n(1-1/p1)(1-1/p2)...(1-1/pk),
如果n不是素数,那么n!和(n-1)!的素因子集合完全相同,因此phifac(n)=phifac(n-1)*n;
如果n是素数,那么还会多一项(1-1/n),即(n-1)/n,约分得phifac(n)=phifac(n-1)*(n-1)。

 

代码:

 1 import java.io.*;
 2 import java.util.*;
 3 import static java.lang.Math.*;
 4 import static java.util.Arrays.*;
 5 
 6 public class Main {
 7     Scanner cin = new Scanner(new BufferedInputStream(System.in));
 8     final long MOD = (long)1e8 + 7;
 9     final int UP = (int)1e7 + 5;
10     boolean isp[] = new boolean[UP];
11     long phifac[] = new long[UP];
12     
13     void constant() {
14         fill(isp, true);
15         int u = (int)sqrt(UP+0.5);
16         for(int i = 2; i <= u; i++) if(isp[i]) {
17             for(int j = i*i; j < UP; j += i) isp[j] = false;
18         }
19         phifac[1] = phifac[2] = 1;
20         for(int i = 3; i < UP; i++)
21             phifac[i] = phifac[i-1] * (isp[i] ? i-1 : i) % MOD;
22     }
23     
24     void MAIN() {
25         constant();
26         while(true) {
27             int n = cin.nextInt();
28             int m = cin.nextInt();
29             if(n + m == 0) break;
30             long ans = phifac[m];
31             for(int i = m+1; i <= n; i++) ans = ans * i % MOD;
32             System.out.println((ans-1+MOD)%MOD); // 注意这里要减1,因为题目从2开始统计
33         }
34     }
35     
36     public static void main(String args[]) { new Main().MAIN(); }
37 }

 








以上是关于UVa 11440 - Help Tomisu(欧拉函数 + 问题转换)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 11440 Help Tomisu 欧拉函数

Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M&l

Uva11384 Help is needed for Dexter

UVA11161 Help My Brother (II)大数+递推

uva 11384 Help is needed for Dexter

[UVa 11384]Help is needed for Dexter