UVa 11440 (欧拉函数) Help Tomisu
2015-01-02 21:15
363 查看
题意:
给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数。
分析:
首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素
对于k大于M!,k与M!互素等价于 k % M! 与 M!互素
所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一(因为是从2开始统计的)
欧拉函数的公式为
代码君
给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数。
分析:
首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素
对于k大于M!,k与M!互素等价于 k % M! 与 M!互素
所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一(因为是从2开始统计的)
欧拉函数的公式为
#include <cstdio> #include <cmath> const int maxn = 10000000 + 10; const int MOD = 100000007; int phifac[maxn]; bool vis[maxn]; void sieve(int n) { int m = sqrt(n + 0.5); for(int i = 2; i <= m; ++i) if(!vis[i]) for(int j = i*i; j <= n; j += i) vis[j] = true; } int main() { sieve(10000000); phifac[1] = phifac[2] = 1; for(int i = 3; i <= 10000000; ++i) phifac[i] = (long long) phifac[i-1] * (vis[i] ? i : i-1) % MOD; int n, m; while(scanf("%d%d", &n, &m) == 2) { if(n == 0 && m == 0) break; int ans = phifac[m]; for(int i = m+1; i <= n; ++i) ans = (long long)ans * i % MOD; printf("%d\n", (ans-1+MOD)%MOD); } return 0; }
代码君
相关文章推荐
- uva 11440 - Help Tomisu(欧拉函数)
- UVA 11440 - Help Tomisu(欧拉函数)
- uva 11440 Help Mr. Tomisu 欧拉函数变种
- UVa11440 - Help Tomisu(数论)
- uva 11440 - Help Tomisu(欧拉功能)
- UVA 11440 Help Tomisu 数论+欧拉函数
- UVa 11440 Help Tomisu 欧拉函数
- Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。
- UVA 11440(p338)----Help Mr.Tomisu
- 11440 - Help Tomisu(计数问题)
- UVa 11440 Help Tomisu (数论欧拉函数)
- UVA 11440 Help Mr. Tomisu 欧拉phi函数
- Trees in a Wood. UVA 10214 欧拉函数或者容斥定理 给定a,b求 |x|<=a, |y|<=b这个范围内的所有整点不包括原点都种一棵树。求出你站在原点向四周看到的树的数量/总的树的数量的值。
- UVA-11426 GCD - Extreme (II) 欧拉函数
- UVA-11384 Help is needed for Dexter
- UVa 10820 - Send a Table 欧拉函数模板
- uva 11384 Help is needed for Dexter
- Uva-11384-Help is needed for Dexter
- Uva11384 Help is needed for Dexter
- 【欧拉函数 && 求gcd(n, x) = y,x的个数】UVA - 11426 GCD - Extreme (II)