链接:

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(欧拉函数 + 问题转换)的更多相关文章

  1. Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。

    /** 题目:Help Tomisu UVA - 11440 链接:https://vjudge.net/problem/UVA-11440 题意:给定正整数N和M, 统计2和N!之间有多少个整数x满 ...

  2. uva 11440 - Help Tomisu(欧拉功能)

    题目链接:uva 11440 - Help Tomisu 题目大意:给定n和m,求从2~n.中的数x.要求x的质因子均大于m.问说x有多少个.答案模上1e9+7. 解题思路: (1)n!=k∗m!(n ...

  3. UVA 11426 GCD-Extreme(II) ★ (欧拉函数)

    题意 求Σ{1<=i<N} Σ{i<j<=N} GCD(i, j)     (N<=4000000) 分析 原始思路 暴力求明显是不行的,我们把式子简化形式一下发现它可以 ...

  4. UVa 11440 (欧拉函数) Help Tomisu

    题意: 给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数. 分析: 首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素 对于k大于M!,k与M!互素等价于 ...

  5. UVa 11440 Help Tomisu (数论欧拉函数)

    题意:给一个 n,m,统计 2 和 n!之间有多少个整数x,使得x的所有素因子都大于M. 析:首先我们能知道的是 所有素数因子都大于 m 造价于 和m!互质,然后能得到 gcd(k mod m!, m ...

  6. UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)

    题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 此 ...

  7. UVa 10214 - Trees in a Wood.(欧拉函数)

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

  8. UVa 10820 - Send a Table(欧拉函数)

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

  9. UVA 12493 Stars (欧拉函数--求1~n与n互质的个数)

    pid=26358">https://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&cate ...

随机推荐

  1. Java学习--内置对象(其他的)

  2. NGINX防御CC攻击教程

    CC攻击即http flood,以攻击成本低(只需数台http代理服务器即可实现攻击).隐蔽性强(中小CC攻击一般不会造成网络瓶颈).难防御(与正常访问的请求很难区分开).威力强大(造成和DDOS流量 ...

  3. idea 中如何生成类图

    前言:记录一下 idea 中如何生成类图,毕竟类图在开发或看源码时用得特别多. 推荐博客:https://blog.csdn.net/zhangle1hao/article/details/78804 ...

  4. BZOJ1911: [Apio2010]特别行动队(dp 斜率优化)

    题意 题目链接 Sol 裸的斜率优化,注意推导过程中的符号问题. #include<bits/stdc++.h> #define Pair pair<int, int> #de ...

  5. 当碰到需要调试打包后的js

    在react中经常开发碰到不能热更中进行调试的,如IE之类的 这个时候我们就需要打包才能运行看到效果, 但是往往每次打包都需要很长的时间: 这个时候我们就可以直接找到打包后的文件,直接在改文件中修改: ...

  6. OTSU算法学习 OTSU公式证明

    OTSU算法学习   OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...

  7. flutter控件之CheckBox

    import 'package:flutter/material.dart'; class LearnCheckBox extends StatefulWidget{ @override State& ...

  8. qemu模拟vexpress-a9及u-boot引导 linux

    前言 本文讲述使用 qemu 来模拟 vexpress-a9 开发板 ,同时介绍使用 u-boot 引导 linux 的流程.整个坐下来对 qemu 和 u-boot 以及嵌入式 linux 的工作方 ...

  9. web容器向jar中寻找资源

    示例代码下载地址 https://files.cnblogs.com/files/Mike_Chang/web%E5%AE%B9%E5%99%A8%E5%90%91jar%E4%B8%AD%E5%AF ...

  10. LeetCode 题解之Minimum Index Sum of Two Lists

    1.题目描述 2.问题分析 直接是用hash table 解决问题 3.代码 vector<string> findRestaurant(vector<string>& ...