uva 11440 - Help Tomisu(欧拉功能)

题目链接:uva 11440 - Help
Tomisu

题目大意:给定n和m,求从2~n。中的数x。要求x的质因子均大于m。问说x有多少个。答案模上1e9+7。

解题思路:

(1)n!=k?m!(n≥m)

(2)
假设有gcd(x,T)=1,那么gcd(x+T,T)=gcd(x,T)=1

题目要求说x的质因子必需要大于m,也就是说x不能包括2~m的因子,那么gcd(x,m!)=1,于是我们求出?(m!),小于m!

而且满足gcd(x,m!)=1的个数。

那么依据(2)可得从[m!+1, 2*m!]中的x个数也是?(m!)个。由于假设存在gcd(x,T)=a,那么gcd(x+T,T)=gcd(x,T)=a.

又由于(1),所以最后n!以内的x个数为:n!??(m!)m!

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 1e7;
const ll MOD = 100000007;

int np, pri[maxn+5], vis[maxn+5];
ll fact[maxn+5], phi[maxn+5];

void prime_table (ll n) {
    np = 0;
    for (ll i = 2; i <= n; i++) {
        if (vis[i])
            continue;

        pri[np++] = i;
        for (ll j = i * i; j <= n; j += i)
            vis[j] = 1;
    }
}

void gcd (ll a, ll b, ll& d, ll& x, ll& y) {
    if (b == 0) {
        d = a;
        x = 1;
        y = 0;
    } else {
        gcd(b, a%b, d, y, x);
        y -= (a/b) * x;
    }
}

inline ll inv_number (ll a, ll n) {
    ll d, x, y;
    gcd(a, n, d, x, y);
    return (x + n) % n;
}

void init (ll n) {
    fact[1] = phi[1] = 1;
    for (ll i = 2; i <= n; i++) {
        fact[i] = (fact[i-1] * i) % MOD;
        phi[i] = phi[i-1];

        if (vis[i] == 0) {
            phi[i] *= ((i-1) * inv_number(i, MOD)) % MOD;
            phi[i] %= MOD;
        }
    }
}

ll solve (int n, int m) {
    ll ans = fact[n] * phi[m] % MOD;
    return (ans - 1 + MOD) % MOD;
}

int main () {
    prime_table(maxn);
    init (maxn);

    int n, m;
    while (scanf("%d%d", &n, &m) == 2 && n + m) {
        printf("%lld\n", solve(n, m));
    }
    return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-07-31 14:23:31

uva 11440 - Help Tomisu(欧拉功能)的相关文章

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]...这每个区间

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

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

UVA 11440 Help Mr. Tomisu 欧拉phi函数

欧拉phi函数的改进版..... Help Tomisu Time Limit: 7000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem D Help Mr. Tomisu Input: Standard Input Output: Standard Output After wasting a significant time of his life in probl

uva 10837 - A Research Problem(欧拉功能+暴力)

题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin.要求一个最小的n.欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p?1;假设p和q互质的话有phip?q=phip?phiq 然后依据这种性质,n=pk11(p1?1)?pk22(p2?1)???pkii(pi?1),将全部的pi处理出来.暴力搜索维护最小值,尽管看上去复杂度很高,可是由于对于垒乘来说,增长很快,所以搜索范围大大被缩小了. #include <cstdi

UVA 10441 - Catenyms(欧拉道路)

UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定,最后dfs输出路径 代码: #include <cstdio> #include <cstring> #include <string> #include <vector> #include <iostream> #include <algo

【日常学习】【欧拉功能】codevs2296 荣誉的解决方案卫队的一个问题

转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 题目来源:SDOI2008 文章被剽窃非常严重啊 所以以后都带上版权信息 先上题目 题目描写叙述 Description 作为体育委员.C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,依据其视线所及的学生人数来推断队伍是否整齐(例如以下图). 如今.C君希望你告诉他队伍整齐时能看到的学生人数. 输入描写叙述 I

UVA 10129-Play on Words(欧拉通路)

题意:给N个单词,判断是否单词首尾(前一个单词的尾字符与后一个单词的头字符相同)相连能否形成一条链. 解析:找欧拉通路(欧拉回路或是欧拉链路),但这题事先需要并查集一下,判断是否只属于一个集合,如aa,bb,cc不能形成一条链,但会判断成欧拉回路. 代码如下: #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<set> #include

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>