BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】
题意:求中
互质的数的个数,其中
。
分析:因为,所以
,我们很容易知道如下结论
对于两个正整数和
,如果
是
的倍数,那么
中与
互素的数的个数为
本结论是很好证明的,因为中与
互素的个数为
,又知道
,所以
结论成立。那么对于本题,答案就是
事实上只要把素数的逆元用exgcd求一求就好,其余并未用到
逆元递推法:
#include<stdio.h>
#include<string.h>
const int N=1e7+;
typedef long long ll;
int pr[N],p[N],cnt,mod;
int inv[N],ans1[N],ans2[N];
int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
void init(){
ans1[]=ans2[]=inv[]=;
for(int i=;i<N;i++){
ans1[i]=(ll)ans1[i-]*i%mod;
if(!p[i])
pr[++cnt]=i;
for(int j=;j<=cnt&&i*pr[j]<N;j++){
p[pr[j]*i]=;
if(i%pr[j]==) break;
}
}
for(int i=;i<N&&i<mod;i++){
inv[i]=(mod-(ll)mod/i)*inv[mod%i]%mod;
}
for(int i=;i<N;i++){
ans2[i]=ans2[i-];
if(!p[i])
ans2[i]=(ll)ans2[i]*(i-)%mod*inv[i%mod]%mod;
}
}
int main(){
int t,n,m;
scanf("%d%d",&t,&mod);
init();
while(t--){
n=read();m=read();
printf("%d\n",(ll)ans1[n]*ans2[m]%mod);
}
return ;
}
扩展欧几里德求逆元
#include<stdio.h>
#include<string.h>
const int N=1e7+;
typedef long long ll;
int pr[N],p[N],cnt,mod;
int inv[N],ans1[N],ans2[N];
int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
int ex_gcd(int a,int b,int &x,int &y){
if(!b){
x=,y=;
return a;
}
int ans=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return ans;
}
int getinv(int i){
int x,y;
ex_gcd(i,mod,x,y);
x=((x%mod)+mod)%mod;
return x;
}
void init(){
ans1[]=ans2[]=inv[]=;
for(int i=;i<N;i++){
ans1[i]=(ll)ans1[i-]*i%mod;
if(!p[i])
pr[++cnt]=i,inv[i]=getinv(i);
for(int j=;j<=cnt&&i*pr[j]<N;j++){
p[pr[j]*i]=;
if(i%pr[j]==) break;
}
}
for(int i=;i<N;i++){
ans2[i]=ans2[i-];
if(!p[i])
ans2[i]=(ll)ans2[i]*(i-)%mod*inv[i%mod]%mod;
}
}
int main(){
int t,n,m;
scanf("%d%d",&t,&mod);
init();
while(t--){
n=read();m=read();
printf("%d\n",(ll)ans1[n]*ans2[m]%mod);
}
return ;
}
http://blog.csdn.net/acdreamers/article/details/8220787
BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】的更多相关文章
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- [BZOJ 2186] [Sdoi2008] 沙拉公主的困惑 【欧拉函数】
题目链接:BZOJ - 2186 题目分析 题目要求出 [1, n!] 中有多少数与 m! 互质.(m <= n) 那么在 [1, m!] 中有 phi(m!) 个数与 m! 互质,如果一个数 ...
- [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2186 分析: 就是要求1~n!中与m!互质的数的个数 首先m!以内的就是φ(m!) 关 ...
- bzoj 2186 [Sdoi2008]沙拉公主的困惑(欧拉函数,逆元)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2186 [题意] 若干个询问,求1..n!中与m!互质的个数. [思路] 首先有gcd( ...
- bzoj 2186: [Sdoi2008]沙拉公主的困惑
#include<cstdio> #include<iostream> #define ll long long #define N 10000009 using namesp ...
- BZOJ 2186 SDOI2008 沙拉公主的困惑 数论
题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n) 首先T<=1W,暴力肯定过不去,我们须要预处理一些东西 首先我们 ...
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
n>=m,所以就变成了求 ϕ(m!)∗n!/m! 而 ϕ(m!)=m!∗(p−1)/p...... p为m!的素因子,即为m内的所有素数,问题就转化为了求 n!∗(p−1)/p...... 只需 ...
- 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
随机推荐
- 如何使用mybatis《三》
在前边阐述了单独使用mybatis的方法,在实际开发过程中mybatis经常和spring一起使用,即mybatis和spring进行集成,现在我们来看如何集成. mybatis和spring进行集成 ...
- require
/* require.js框架 RequireJS 2.1.11 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. ...
- 解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
原因是app management service没有设置好,在管理中心把他删掉,重新建一个就可以了 Provision App Management Service In SharePoint 20 ...
- 浅谈URLEncoder编码算法
一.为什么要用URLEncoder 客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将 ...
- 【转】android应用程序的安装方式与原理
四种安装方式: 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用安装――通过SD卡里的 ...
- C语言泛型编程--抽象数据类型
一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...
- 递归练习(C语言)
本文地址:http://www.cnblogs.com/archimedes/p/recursive-practice.html,转载请注明源地址. 1.炮弹一样的球状物体,能够堆积成一个金字塔,在顶 ...
- OC小实例关于init方法不小心的错误
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 深入理解java虚拟机(4)---类加载机制
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
- openstack问题汇总
No tenant network is available for allocation. No tenant network is available for allocation. 这个问 ...