【UVA】11440 - Help Tomisu

又是一道不明觉厉的题,做这道题需要分析以下几个点:

1.如果k的任意素因子大于M,那么说明k和M!一定互质。

原因:任何数都可以写成一个唯一分解式子:k = p1^a1 * p2^a2 * ……;(p1 < p2 < p3……且都是质数)。

那么如果k的任意素因子大于M,那么说明 p1 > M, 又因为 M! = 1 * 2 * …… * M;所以k和M!一定没有除了1以外约束。

2.欧拉公式:小于一个数(n)的所有质因子 =  n * (1 - 1/p1)(1- 1/p2) ……(1-1/pk)。

3.如何N和M互质,那么N % M 与 M 互素。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-9
#define MOD 100000007
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 10000000 + 1
int is_Prime[MAXD];
LL phi[MAXD];  /* 小于i!的素因子个数*/
void Get_Prime(){   /*筛选法打素数表*/
    memset(is_Prime,0,sizeof(is_Prime));
    /*1代表不是素数,0代表是素数*/
    is_Prime[1] = 0;
    for(int i = 2 ; i <= sqrt(MAXD) ; i++)if(!is_Prime[i]){
        for(int j = i * i ; j < MAXD ; j += i)
            is_Prime[j] = 1;
    }
}
void init(){
    Get_Prime(); /*打出1 ~ 1000000的素数表*/
    phi[1] = 1; phi[2] = 1;
    for(int i = 3 ; i < MAXD ; i++)
        phi[i] = (LL)(is_Prime[i] == 1 ?  i * phi[i - 1] :  (i - 1) * phi[i - 1]) % MOD;
}
int main(){
    init();  /*预处理*/
    int N,M;
    while(scanf("%d%d",&N,&M)){
        if(!N && !M)
            break;
        LL ans = phi[M];
        for(int i = M + 1 ; i <= N ; i++)
           ans = ans * i % MOD;
        printf("%lld\n",(ans - 1 + MOD) % MOD);
    }
    return 0;
}

【UVA】11440 - Help Tomisu

时间: 2024-08-19 11:20:43

【UVA】11440 - Help Tomisu的相关文章

【UVA】12034-Race(递推,组合数打表)

递推公式,假设第一名有i个人并列,那么: f[n] = C(n,i) * f[n - i]; 打出1 ~ 1000的所有组合数,之后记忆化搜索,需要打表. 14026995 12034 Race Accepted C++ 0.032 2014-08-12 11:47:47 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector&g

【UVA】10285-Longest Run on a Snowboard(动态规划)

这题出简单了,不需要打印路径. 状态方程dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i+1][j],dp[i][j+1]); 14003395 10285 Longest Run on a Snowboard Accepted C++ 0.026 2014-08-07 11:43:51 枚举每个点进行遍历,使用记忆化搜索.要不会超时. #include<cstdio> #include<cstring> #include<iostream&

【UVA】434-Matty&amp;#39;s Blocks

一道非常easy想复杂的题,给出主视图和右视图,计算最少能用几个正方体组成相应的视图,以及最多还能加几块正方体. 求最多加入事实上就是求出最多的正方体数减去最少的,主要就是最少的不好求. 一開始各种模拟就是不正确,之后发现,仅仅须要统计两个视图的高度个数就能够了(简直了) 14390495 434 Matty's Blocks Accepted C++ 0.016 2014-10-21 11:35:11 #include<cstdio> #include<cstring> #inc

【UVA】434-Matty&#39;s Blocks

一道很容易想复杂的题,给出主视图和右视图,计算最少能用几个正方体组成对应的视图,以及最多还能加几块正方体. 求最多添加其实就是求出最多的正方体数减去最少的,主要就是最少的不好求. 一开始各种模拟就是不对,之后发现,只需要统计两个视图的高度个数就可以了(简直了) 14390495 434 Matty's Blocks Accepted C++ 0.016 2014-10-21 11:35:11 #include<cstdio> #include<cstring> #include&l

【UVA】12169-Disgruntled Judge(暴力or欧几里得)

可能由于后台数据的原因,这道题直接暴力枚举a,b进行判断也能过,不过跑的时间长,效率太差了. 14021006 12169 Disgruntled Judge Accepted C++ 0.876 2014-08-11 08:46:28 不说了,比较无脑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #incl

【UVa】Headmaster&#39;s Headache(状压dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1758 晕....状压没考虑循环方向然后错了好久.. 这点要注意...(其实就是01背包变成了完全背包QAQ 我们将课程拆成两个点,然后状压 那么答案就是(1<<(s<<1))-1 转移就不说了,,,,,太简单.. #include <cstdio> #in

【UVA】1210 - Sum of Consecutive Prime Numbers

普通的求区间连续和的问题,一开始以为是区间移动,但是怕UVA数据太严,直接打表,后来发现自己的担心是多余的. 14044972 1210 Sum of Consecutive Prime Numbers Accepted C++ 0.049 2014-08-15 10:30:11 打表的话效率可能不是很高. AC代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&

【UVA】815 - Flooded!

水题,排序之后依次累加,模拟. 14069284 815 Flooded! Accepted C++ 0.032 2014-08-20 10:42:17 AC代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #includ

【UVA】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0