【BZOJ2186】沙拉公主的困惑(数论)

题面

BZOJ

题解

考虑答案是啥

先假设\(n=m\)

现在求的就是\(\varphi(m!)\)

但是现在\(n!\)是\(m!\)的若干倍

我们知道

\(gcd(x,y)=gcd(x+ky,y)\)

所以,相当于

每隔\(m!\),答案增长的值都是\(\varphi(m!)\)

所以

我们可以得出

\[ans=\frac{n!}{m!}\varphi(m!)
\]

后面的\(\varphi\)可以直接拆开,枚举质因数

\[ans=\frac{n!}{m!}·m!\frac{\prod (p_i-1)}{\prod p_i}
\]

\[ans=n!\frac{\prod (p_i-1)}{\prod p_i}
\]

其中,\(pi<=m\)

所以,预处理\(n!\),质数的前缀乘,还有质数\(-1\)的前缀乘

至于逆元就不要预处理了(慢的死)

要用的时候直接快速幂算一下

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 10000000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int R;
int n,m;
bool zs[MAX+1];
int pri[MAX/10],tot,jc[MAX+1];
int inv[MAX+1],pinv[MAX/10],ppri[MAX/10];
int Pos[MAX+1];
int fpow(int a,int b)
{
int s=1;
while(b){if(b&1)s=1ll*s*a%R;a=1ll*a*a%R;b>>=1;}
return s;
}
void pre()
{
zs[1]=true;inv[1]=jc[1]=1;
for(int i=2;i<=MAX;++i)
{
jc[i]=1ll*jc[i-1]*i%R;
if(!zs[i])pri[++tot]=i;//,inv[i]=fpow(i,R-2);
for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
{
zs[i*pri[j]]=true;
//inv[i*pri[j]]=1ll*inv[i]*inv[pri[j]]%R;
if(i%pri[j]==0)break;
}
}
pinv[0]=ppri[0]=1;
for(int i=1;i<=tot;++i)pinv[i]=1ll*pinv[i-1]*pri[i]%R;
for(int i=1;i<=tot;++i)ppri[i]=1ll*ppri[i-1]*(pri[i]-1)%R;
for(int i=1;i<=tot;++i)
for(int j=pri[i];j<pri[i+1];++j)
Pos[j]=i;
}
int Query(int n,int m)
{
return 1ll*jc[n]*fpow(pinv[Pos[m]],R-2)%R*ppri[Pos[m]]%R;
}
int main()
{
int T=read();R=read();
pre();
while(T--)
{
n=read();m=read();
printf("%d\n",Query(n,m));
}
return 0;
}

【BZOJ2186】沙拉公主的困惑(数论)的更多相关文章

  1. [BZOJ2186]沙拉公主的困惑

    [BZOJ2186]沙拉公主的困惑 题面 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定 ...

  2. 【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数

    [bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...

  3. BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...

  4. 【BZOJ2186】【SDoi2008】沙拉公主的困惑 数论

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...

  5. [bzoj2186][Sdoi2008]沙拉公主的困惑——数论

    题目大意 求 \[\sum_{i = 1}^{N!} [gcd(i, M!) = 1]\] 题解 显然,题目就是求 \[N!(1-\frac{1}{p_1})(1-\frac{1}{p_2})...\ ...

  6. BZOJ 2186 SDOI2008 沙拉公主的困惑 数论

    题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n) 首先T<=1W,暴力肯定过不去,我们须要预处理一些东西 首先我们 ...

  7. [bzoj2186][Sdoi2008]沙拉公主的困惑_数论

    沙拉公主的困惑 bzoj-2186 Sdoi-2008 题目大意:求N!中与M!互质的数的个数. 注释:$1\le N,M\le 10^7$. 想法:显然是求$\phi(M!)$.这东西其实只需要将数 ...

  8. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  9. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

    [BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...

随机推荐

  1. LNMP搭建02 -- 编译安装Nginx

    [编译安装Nginx]   为了顺利安装Nginx,先安装下面这些: [CentOS 编译 nginx 前要做的事情] yum install gcc gcc-c++ kernel-devel yum ...

  2. Ubuntu系统下crontab的使用

    最近一个项目,需要用到一个定时任务,先说crontab的常用命令. crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出 ...

  3. NGUI的新手引导的实现

    先声明一下,UNITY新手,如果说的有不对的地方,欢迎各位大神指正. 最近在项目需要实现新手引导,最基础的需求就是需要一个带黑色遮罩的引导UI,类似下图这种: 对,就是这么敷衍的UI,因为是我随手做的 ...

  4. 【转】磁盘I/O那些事

    背景 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时 ...

  5. <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>区别

    <url-pattern>/</url-pattern>表示的为只匹配/login和/demo后面不带.xxx的网页 <url-pattern>/*</url ...

  6. dubbox系列【二】——dubbox admin环境搭建

    1.环境 JDK7+ zookeeper 3.3.6 tomcat 7+ 2.搭建步骤 (1)安装zookeeper 单机模式:参考这里. 伪集群模式:参考这里. ①单机或伪集群模式均可. ②笔者使用 ...

  7. 在kali安装中文输入法的教程

    1终端下vi /etc/apt/sources.list  修改镜像元  (按E进行编辑 具体实例不同可能没有)  按 i进入编辑 擦除原有的几个官方源改为deb http://mirrors.ali ...

  8. Pandoc将markdown转换为word

    markdown转换为word的指令 直接将markdown转换为word pandoc -f markdown -t docx ./test.md -o test.docx 关于markdown转为 ...

  9. Centos7下,简单DOCKER 使用.映射SSH端口到宿主主机.

    其实使用docker完全没有必要ssh,初学的时候,可以这样熟悉以下操作. 参考这哥们的文章:http://www.jianshu.com/p/d2dd936863ec 获取镜像 docker pul ...

  10. init启动进程

    init启动进程需要读取()配置文件 1,启动init进程的配置文件是/etc/inittab 2,/etc/sysvinit是系统初始化用的   /sbin/init在核心完整的加载后,开始运行系统 ...