2186: [Sdoi2008]沙拉公主的困惑

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2560  Solved: 857
[Submit][Status][Discuss]

Description

  大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。

Input

第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n

Output

共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值

Sample Input

1 11
4 2

Sample Output

1

数据范围:
对于100%的数据,1 < = N , M < = 10000000

HINT

 

Source

 题解:
因为若x和y互质,则x+y,x+2*y,x+3*y …… x+k*y 都与y互质。
所以若 x<=m! ,且x与m!互质。那么x,x+m!, x+2*m! …… x+k*m! 都与m!互质。
因为n!为m!的倍数,所以得到与m!互质的x后,则一定有n!/m! 个与m!互质的数(x的倍数)。
与m!互质且小于等于m!的数的个数就是φ(m!)。
则ans=φ(m!)*(n!/m!)%R
    =m!*[∏((Pi) - 1)/(Pi)]*(n!/m!)  (Pi<=m)
    =m!*[∏((Pi) - 1)/(Pi)]*(n!/m!)  (Pi<=m)
    =[∏((Pi) - 1)/(Pi)]*n!  (Pi<=m)
然后预处理出来 质数,∏((Pi) - 1)/(Pi) (Pi<=10000000)  ,n!(1<=n<=10000000)。
最后O(1)输出即可。
注意:筛素数要用线性筛。QAQ
 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define MAXN 10000000
#define MAXP 670010
int jc[MAXN+],cj[MAXN+],cc[MAXN+],tot;
int prime[MAXP],ny[MAXP];
bool vis[MAXN+];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
int ksm(LL bb,LL pp,LL kk)
{
LL s=;
while(pp>)
{
if(pp%!=)s=(LL)(s*bb)%kk;
pp/=;
bb=(LL)(bb*bb)%kk;
}
return s;
}
void getprime()
{
int i,j;
tot=;
for(i=;i<=MAXN;i++)
{
if(vis[i]==false)prime[++tot]=i;
for(j=;j<=tot&&prime[j]*i<=MAXN;j++)
{
vis[prime[j]*i]=true;
if(i%prime[j]==)break;
}
}
/*for(i=2;i<=MAXN;i++)
{
if(vis[i]==false)
{
prime[++tot]=i;
for(j=i+i;j<=MAXN;j+=i)vis[j]=true;
}
}*/
}
int main()
{
int T,R,i,N,M;
T=read();R=read();
getprime();
for(i=;i<=tot;i++)ny[i]=ksm(prime[i],R-,R);
jc[]=;
cj[]=;
for(i=;i<=tot;i++)cc[prime[i]]=(LL)(prime[i]-)*ny[i]%R;
for(i=;i<=MAXN;i++)
{
jc[i]=(LL)jc[i-]*i%R;
if(cc[i]!=)cj[i]=(LL)cj[i-]*cc[i]%R;
else cj[i]=cj[i-];
}
while(T--)
{
N=read();M=read();
printf("%lld\n",(LL)jc[N]*cj[M]%R);
}
fclose(stdin);
fclose(stdout);
return ;
}

Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论的更多相关文章

  1. The Euler function(线性筛欧拉函数)

    /* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...

  2. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

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

  3. [BZOJ 2186] [Sdoi2008] 沙拉公主的困惑 【欧拉函数】

    题目链接:BZOJ - 2186 题目分析 题目要求出 [1, n!] 中有多少数与 m! 互质.(m <= n) 那么在 [1, m!] 中有 phi(m!) 个数与 m! 互质,如果一个数 ...

  4. [bzoj 2190][SDOI2008]仪仗队(线性筛欧拉函数)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 分析:就是要线性筛出欧拉函数... 直接贴代码了: memset(ans,,sizeof ...

  5. BZOJ 2190 仪仗队(线性筛欧拉函数)

    简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...

  6. 素数的线性筛 && 欧拉函数

    O(n) 筛选素数 #include<bits/stdc++.h> using namespace std; const int M = 1e6 + 10 ; int mindiv[M] ...

  7. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  8. noip复习——线性筛(欧拉筛)

    整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\ ...

  9. [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2186 分析: 就是要求1~n!中与m!互质的数的个数 首先m!以内的就是φ(m!) 关 ...

随机推荐

  1. 国内最简单的短视频SDK

    最近阿里百川和趣拍一起合作推出了一个短视频SDK.之前很多厂商可能都是用的Vitamio的短视频SDK.之后我考察过,也做过一些调查,发现Vitamio真的奇贵无比,屌丝公司根本用不起,阿里和趣拍这下 ...

  2. (转) c# ExecuteNonQuery() 返回值 -1

    这是之前我遇到问题,在网上找解决方法时找到的,当时复制到txt文档了,今天整理笔记又看到了,贴出来,便于以后查阅.原文的作者没记住~~ 查询某个表中是否有数据的时候,如果用ExecuteNonQuer ...

  3. 转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效

    angular的坑很多 例子: 在directive的link中有一个$http请求,当请求完成后根据返回的值动态做element.append('......');这个操作, 能显示没问题,可问题是 ...

  4. 生产者与消费者(三)---BlockingQueue

    前面阐述了实现生产者与消费者问题的两种方式:wait() / notify()方法 和 await() / signal()方法,本文继续阐述多线程的经典问题---生产者与消费者的第三种方式:Bloc ...

  5. 将P2P虚拟货币(比特币、莱特币....)的算力用于公共的分布式计算的猜想

    比特币最近几年非常火爆.发明者中本聪设计了一个特定的算法用于生成(发行)比特币,让各位玩家(矿工)用自己的CPU.显卡,或者更加专业的矿机,通过无聊的并行计算算出比特币的特定密码(挖矿).为了保证全网 ...

  6. MATLAB中的函数的归总

    字符串操作函数 1.        函数eval可以用来执行用字符串表示的表达式 2.        函数deblank可以去掉字符串末尾的所有空格 3.        函数findstr可以用来在长 ...

  7. Java环境变量配置&解决版本不一致问题

    之前用Myeclipse编译运行Java没有问题 但是突然想用简单点的NotePad++以及cmd直接编译运行Java 这就让我倒腾了一晚上 先说下问题的解决,再总结下查阅的一些知识. 1.进行win ...

  8. 分享一个自己写的基于TP的关系模型

    为了说明问题,假设现在有表test1,test1有从表test2:test1属于test3,test1和test4多对多,关联表test1_test4. 1.定义关系 class Test1Model ...

  9. python细节

    1.assert 断言语句,可判断一句话真假,若为假会抛出AssertionError. eg. assert 1==1     assert 1==2则AssertionError 2.单引号双引号 ...

  10. 在CAD中怎么画圆形视口的详细说明

    方法如下:在布局下画一个合适的圆,然后:命令: _-vports指定视口的角点或[开(ON)/关(OFF)/布满(F)/消隐出图(H)/锁定(L)/对象(O)/多边形(P)/恢复(R)/2/3/4]& ...