这里用到了一些数论知识

首先素因子都大于M等价与M! 互质

然后又因为当k与M!互质且k>M!时当且仅当k mod M! 与M!互质(欧几里得算法的原理)

又因为N>=M, 所以N!为M!的倍数

所以只要求1到M!中与M!互质的数的个数,在乘上N!/M!

可以理解为每一块M!有这么多,然而N!中有很多块M!,所以乘上N!/M!

然后根据phifac[n] = phi[n!] = n!(1-1/p1)(1-1/p2)......(1-1/k)的定义可以得出

当n为质数的时候 phifac[n] = (n-1) * phifac[n-1]

当n不为质数的时候 phifac[n] = n * phifac[n-1]

(拿笔根据定义手算一下就可以得出)

边界是phifac[1] = phifac[2] = 1

书中问到为什么phifac[1] = 1

实际上是因为如果m=1,那么除1以外的所有数的素因子都大于1(素因子最小为2)

所以当m=1时后面乘的时候ans是为1的,如果ans为0的话最终答案为0

而实际上答案为N!-1

根据定义是phifac[1]=0,但根据这道题实际情况phifac[1]=1

最后注意中间结果可能溢出,所以用long long

#include<cstdio>
#include<vector>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 11234567;
const int MOD = 100000007;
bool is_prime[MAXN];
vector<int> prime;
int phifac[MAXN]; void init()
{
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
REP(i, 2, MAXN)
{
if(is_prime[i]) prime.push_back(i);
REP(j, 0, prime.size())
{
if(i * prime[j] > MAXN) break;
is_prime[i*prime[j]] = false;
if(i % prime[j] == 0) break;
}
}
} int main()
{
init();
int n, m; phifac[1] = phifac[2] = 1;
REP(i, 3, MAXN)
phifac[i] = (long long)phifac[i-1] * (is_prime[i] ? i-1 : i) % MOD; while(~scanf("%d%d", &n, &m) && n)
{
int ans = phifac[m];
REP(i, m + 1, n + 1) ans = (long long)ans * i % MOD;
printf("%d\n", (ans - 1 + MOD) % MOD);
} return 0;
}

最新文章

  1. 纯css3制作写轮眼开眼及进化过程
  2. 批量生成clr脚本
  3. understanding Nhibernate Hilo
  4. yii2安装
  5. C#连接SQL Server数据库进行简单操作
  6. Python中的SET集合操作
  7. Oracle数据文件管理
  8. WP8教程
  9. autoSvn
  10. windows下使用redis,Redis入门使用,Redis基础命令
  11. Eclipse中修改SVN用户名和密码方法[转]
  12. Request获取url各种信息的方法
  13. Microsoft Azure 大计算 – 宣布收购 GreenButton
  14. 微信小程序picker组件 - 省市二级联动
  15. 初学者易上手的SSH-spring 01控制反转(IOC)
  16. 基于SDL2实现俄罗斯方块
  17. [视频]K8飞刀 HackIE\EXP测试\Post提交
  18. WebApi 异步请求(HttpClient)
  19. [ctsc2018] 混合果汁 【可持久化线段树】【二分答案】
  20. 500 G JAVA视频网盘分享(JEECG开源社区)

热门文章

  1. Edge 浏览器
  2. SpringBoot(四) Web开发 --- Thymeleaf、JSP
  3. MyBatis数据持久化(九)动态sql
  4. Enable .Net 4.5 in IIS on Windows 8.1
  5. HDU 2120 Ice_cream&#39;s world I【并查集】
  6. thread.h
  7. SpringCloud学习笔记(11)----Spring Cloud Netflix之Hystrix断路器的使用
  8. ZBrush中Z球(ZSphere和ZSphereⅡ)
  9. CentOS-1810系统DHCP服务器ISC DHCP软件配置说明
  10. [APIO2012]派遣 可并堆(左偏树)