BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
来源:互联网 发布:移动开通国际数据 编辑:程序博客网 时间:2024/03/29 20:08
题目地址:BZOJ 2186
题意:求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 <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <sstream>#include <algorithm>#include <set>#include <queue>#include <stack>#include <map>#include <bitset>#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<Maxn>prime;LL fac[Maxn];LL inv[Maxn];LL res[Maxn];int mod;void isprime(){ prime.set(); for(int i=2; i<Maxn; i++) { if(prime[i]) { for(int j=i+i;j<Maxn;j+=i) prime[j]=0; } }}void getFac(){ fac[0]=1; for(int i=1;i<Maxn;i++) fac[i]=fac[i-1]*i%mod;}int main(){ isprime(); int T,n,m; scanf("%d %d",&T,&mod); getFac(); inv[1]=1; for(int i=2;i<Maxn;i++){ if(i>=mod) break; inv[i]=(mod-mod/ i)*inv[mod%i]%mod; } res[1] = 1; for(int i=2;i<Maxn;i++) { if(prime[i]) { res[i]=(res[i-1]*(i-1)%mod)*inv[i%mod]%mod; } else { res[i]=res[i-1]; } } while(T--) { scanf("%d %d",&n,&m); printf("%lld\n",fac[n]*res[m]%mod); } return 0;}
0 0
- BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
- BZOJ 2186 [Sdoi2008]沙拉公主的困惑 线性逆元
- BZOJ 2186 [Sdoi2008]沙拉公主的困惑(逆元)
- bzoj 2186: [Sdoi2008]沙拉公主的困惑
- 【bzoj 2186】: [Sdoi2008]沙拉公主的困惑
- BZOJ 2186 [Sdoi2008]沙拉公主的困惑
- BZOJ 2186: [Sdoi2008]沙拉公主的困惑
- bzoj 2186 [Sdoi2008]沙拉公主的困惑
- BZOJ 2186 [Sdoi2008] 沙拉公主的困惑
- BZOJ 2186 [Sdoi2008]沙拉公主的困惑
- 2186: [Sdoi2008]沙拉公主的困惑 线性筛素数+欧拉函数+乘法逆元
- BZOJ 2186: [Sdoi2008]沙拉公主的困惑 (逆元的应用)
- bzoj 2186: [Sdoi2008] 沙拉公主的困惑 (数论,逆元)
- BZOJ 2186 [Sdoi2008] 沙拉公主的困惑 逆元/欧拉定理
- BZOJ 2186: [Sdoi2008]沙拉公主的困惑 [欧拉函数][逆元]
- Bzoj2186:[Sdoi2008]沙拉公主的困惑:欧拉函数+乘法逆元
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
- bzoj2186: [Sdoi2008]沙拉公主的困惑 逆元
- 以消息对话框的形式输出当前时间
- LintCode 删除排序数组中的重复数字 II
- Java堆和native堆
- 【BLE】CC2541之OLED
- 数据源1
- BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
- UICollectionView的使用
- [转载学习]
- hdu 4825 Xor Sum
- c++遍历文件夹中的图片(或文件)
- 向量及其运算
- linux,shell后台启动一个死循环程序不停输出信息,当关闭shell后重新打开为嘛没输出了
- CentOS 7 主机名的修改
- synchronized关键字实例解析