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满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5)
输出答案除以1e8+7的余数。
思路:
lrjP338

由于x的所有素因子都>M;那么x与M!互质。
根据最大公约数的性质,对于x>y,x与y互质,那么x%y与y也互质。
由于N>=M,那么N!%M!==0;
这样只需要求出M!内与M!互质的数的个数。再乘以N!/M!即为结果。
问题的重点在于求phi(M!);

根据欧拉函数公式:

phi(n) = n*(1-1/p1)*(1-1/p2)*...*(1-1/pk);

求phi(n!), 如果n为合数,那么phi(n!) = phi((n-1)!)*n;

如果n为素数,那么phi(n!) = phi((n-1)!)*n/(1-1/n) = phi((n-1)!)*(n-1);

phi(1) = phi(2) = 1;

设f(i) = phi(i!);

*/

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const int mod = 1e8+7;
int f[maxn];
int prime[maxn];
void init()
{
    int N = sqrt(maxn+0.5);
    memset(prime, 0, sizeof prime);
    for(int i = 2; i<=N; i++){
        if(prime[i]==0){
            for(int j = i*i; j < maxn; j+=i){
                prime[j] = 1;
            }
        }
    }
    ///prime[i]==0; is prime;
    f[1] = f[2] = 1;
    for(int i = 3; i < maxn; i++){
        f[i] = 1LL*f[i-1]*(prime[i]==0?(i-1):i)%mod;
    }
}
int main()
{
    int n, m;
    init();
    while(scanf("%d%d",&n,&m)==2)
    {
        if(n==0&&m==0) break;
        ll ans = f[m];
        for(int i = m+1; i <= n; i++){
            ans = ans*i%mod;
        }
        printf("%lld\n",(ans-1+mod)%mod);
    }
    return 0;
}
时间: 2024-10-17 18:15:49

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

uva 11317 - GCD+LCM(欧拉函数+log)

题目链接:uva 11317 - GCD+LCM 题目大意:给定n,求出1~n里面两两的最大公约的积GCD和最小公倍数的积LCM,在10100进制下的位数. 解题思路:在n的情况下,对于最大公约数为i的情况又phi[n/i]次.求LCM就用两两乘积除以GCD即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; ty

POJ 2407 Relatives &amp;&amp; UVA 10299 Relatives(欧拉函数)

[题目链接]:click here~~ [题目大意]:欧拉函数:求少于或等于n的数中与n互素的数的个数:n <= 1,000,000,000. [思路]:裸欧拉函数,注意特判n==1的情况,n==1的情况下,应该输出0,poj依然判断1也可以过,但是老牌ojUVA必须是0才过,注意一下. 代码: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm>

HLG 1807 噢啦 (欧拉函数)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1807 Description 上个星期,小胖子学会了欧拉函数,他得意的说:"在a和b之间有多少个与c互素的数字,这样的简单题用欧拉就哦啦!" 可是这次三三又问小胖子,在a和b之间有多少个与c互素的数. Input 第一行包括一个整数t,代表测试次数(1<=1000). 接下来每一组测试次数输入a,b,c,满足

浅谈欧拉函数

笔者太菜,现在才学欧拉函数还学得不咋滴-- 定义 定义:\(φ(n)\)是小于等于\(n\),且与\(n\)互质的数的个数. 写成另一个式子就是:\(∑_{i=1}^{n} 1[gcd(i,n)==1]\) 有一个结论,是\(φ(n)\)为积性函数,即有\(φ(ab)=φ(a)*φ(b)\). 还有一些其它性质:当\(p\)为质数时,显然有\(φ(p)=p-1\). 若\(p|n\) 且\(p^2 | n\),则\(φ(n)=φ(n/p)*p\) 若\(p|n\) 且不满足\(p^2 | n\)

HDOJ 1787 GCD Again(欧拉函数)

GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2611    Accepted Submission(s): 1090 Problem Description Do you have spent some time to think and try to solve those unsolved problem a

HDU 4983 Goffi and GCD(欧拉函数模板)

Problem Description: Goffi is doing his math homework and he finds an equality on his text book: gcd(n−a,n)×gcd(n−b,n)=n^k. Goffi wants to know the number of (a,b) satisfy the equality, if n and k are given and 1≤a,b≤n. Note: gcd(a,b) means greatest

欧拉函数总结【数论】【欧拉函数】

欧拉函数的定义:euler(k)=([1,n-1]中与n互质的整数个数). eg:euler(8)=4.由于1,3,5,7均和8互质. 能够推出下面公式: euler(k)=(p1-1)(p2-1)--(pi-1)*(p1^(a1-1))(p2^(a2-1))--(pi^(ai-1)) =k*(p1-1)(p2-1)--(pi-1)/(p1*p2*--pi); =k*(1-1/p1)*(1-1/p2)....(1-1/pk)  故euler函数表达通式:euler(x)=x(1-1/p1)(1-

UVA 11440 - Help Tomisu(欧拉函数)

UVA 11440 - Help Tomisu 题目链接 题意:给定n和m,求[2,n!]中,所有质因子个数都大于m的个数 思路:?(m!)表示小于m!并与m!互质的个数,而与m!互质的个数,他的质因子肯定不包含1-m,因此就是满足条件的.然后对于这题而言,则是要求n!中,不与m!互质的个数,答案取模100000007 那么先看一个证明: 求kn中与n互质的个数,答案为k?(n). ?(n)表示1-n中与n互质的个数,那么由此考虑[n + 1, 2n], [2n + 1, 3n]...这每个区间

UVa 11440 (欧拉函数) Help Tomisu

题意: 给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数. 分析: 首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素 对于k大于M!,k与M!互素等价于 k % M! 与 M!互素 所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一(因为是从2开始统计的) 欧拉函数的公式为a phifac[n] = φ(n!),我们递推求phifac 当n为合数时,n!和(n-1)!的素因数的集合是一样的,所以phifac[n] =