博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
阅读量:2029 次
发布时间:2019-04-28

本文共 895 字,大约阅读时间需要 2 分钟。

题目地址:

题意:求1~n!中与m!互质的数的个数,且m<=n(1 < = n , m < = 10000000)
思路:因为m<=n,所以m!能被n!整除,那么我们很容易推出下面结论:
对于两个正整数n和m,,如果n是m的倍数,那么1~n中与m互质的数的个数为n/m*Eular(m)。
因为欧拉函数的通式为:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)。所以对于本题目来说,答案如下:
这里写图片描述
其中pi为<=m的所有素数,因为对于1-1/pi=(pi-1)/pi=(pi-1)*inv(pi),所以这里要用到逆元,对于1~p中模p的逆元,如果p很大,那么有一个递推式可以求逆元:inv[i]=(m-m/i)*inv[m%i]%m,初始化inv[1]=1

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-6;using namespace std;const int Maxn=1e7+10;bitset
prime;LL fac[Maxn];LL inv[Maxn];LL res[Maxn];int mod;void isprime(){ prime.set(); for(int i=2; i
=mod) break; inv[i]=(mod-mod/ i)*inv[mod%i]%mod; } res[1] = 1; for(int i=2;i
你可能感兴趣的文章
Spring中WebApplicationInitializer的理解
查看>>
[Java] I/O底层原理之一:字符流、字节流及其源码分析
查看>>
github提交PR(pull request)过程和问题
查看>>
java的初始化顺序
查看>>
纯手写lombok插件(试玩版)
查看>>
java类中serialVersionUID的作用
查看>>
Java serialVersionUID 有什么作用?
查看>>
Java中的关键字 transient
查看>>
transient在java中的作用
查看>>
Java 利用枚举实现单例模式
查看>>
Java—Object对象和Collection对象的toString()方法
查看>>
Java数组的三种打印方式
查看>>
Lists.newArrayList
查看>>
Arrays.asList和Lists.newList使用时的陷阱
查看>>
Java集合和数组的区别
查看>>
快速理解java泛型用法
查看>>
部分版本Oracle多层嵌套查询不识别列名的BUG
查看>>
Java泛型的学习和使用
查看>>
代码整洁之道——最佳实践小结
查看>>
代码整洁 vs 代码肮脏
查看>>