BZOJ2186 欧拉函数
欧拉函数:一般记作φ(n),表示1-n中与n互质的数的数量。
欧拉函数是积性函数,即φ(m*n)=φ(m)*φ(n) //这条定理基友面试时还遇到了= =
欧拉函数的值φ(n)=n*(1-p[1])*(1-p[2])*...*(1-p[n]) //p[i]是小于等于n的所有素数
若n是m的倍数,则小于等于n且与m互质的数的个数为(n/m)*φ(m) //证明不难理解:设k小于等于m且与m互质,则k+m、k+2m......也与m互质
若n是质数p的k次幂,则φ(n)=(p-1)*(p^(k-1))
//关于欧拉函数wikipedia上讲的很详细,此处不赘述了
若a mod b=0,可记作b|a
那么原题的答案就是(n!/m!)*φ(m!)
isprime(n):计算1-n的质数
calc_fac(n):计算1-n每个数的阶乘
calc_inv(n):计算1-n每个数的逆元
calc_eul(n):计算(1-1/p1)*(1-1/p2)*...*(1-1/pn)
设x[i]=inv(p[i]),那么
(1-1/p[i]) mod m
= ( (1 mod m) - ( (1/p[i]) mod m ) ) mod m
= (m+1-( (1/p) mod m ) mod m
而根据逆元的性质,有(1/p) mod m=x mod m
Reference:http://blog.csdn.net/acdreamers/article/details/8220787
http://www.cnblogs.com/autsky-jadek/p/4054971.html
附SDOI官方题解:
该题即求1至n!中与m!互质的数对某质数R取模后的值 。
对于每一对数N,M,设p1,p2,……pn为不大于M的质数,题目即求在1至N!中,不包含因子p1,p2,……pn的数的个数。
在1至N!中,p1的倍数有N!/p1个,p2的倍数有n!/p2个……p1p2的倍数有n!/p1p1个……p1p2p3..pkm的倍数有n!/p1p2p3..pkm个。
由容斥定理得答案为:
n!-n!/p1-n!/p2-n!/p2…-n!/pkm+n!/p1p2+n!/p1p3……+(-)^km*n!/p1p2p3…pkm= n!*(-/p1)*(-/p2)*(-/p3)*(-/p4)…*(-/pkm)
记m!* (-/p1)*(-/p2)*(-/p3)*(-/p4)…*(-/pkm)为fi[m]。答案为n!/m!*fi[m]。
根据fi的计算式,可得fi的递推式为
Fi[i]=fi[i-]*i(当i为合数)
Fi[i]=fi[i-]*(i-)(当i为质数) 预处理得所有fi与i!,通过扩展GCD计算除法,可在O(logR)时间内计算得每一个解。
各种卡时限,cin、cout是用不了的,关了同步都不行>_<
#include "cstring"
#include "math.h"
#include "stdio.h"
using namespace std;
#define MMX 10000002
#define LL long long
LL M,N,T,MOD;
LL fa[MMX],inv[MMX],ans2[MMX];
bool pr[MMX]; void isprime(LL n) //pr[i]=1 : i is a prime
{
memset(pr,true,sizeof(pr));
LL m=sqrt(n+0.5);
pr[]=false;
for (LL i=;i<=m;i++)
if (pr[i])
{
for (LL j=i*i;j<=n;j+=i)
pr[j]=false;
}
} void calc_fac(LL n) //fa[i]=i!
{
fa[]=;
for (LL i=;i<=n;i++)
fa[i]=fa[i-]*i%MOD;
} void calc_inv(LL n) //inv[i]
{
inv[] = ;
for(int i=;i<n;i++) //inv[i]:逆元
{
if(i >= MOD) break;
inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
}
} void calc_eul(LL n)
{
ans2[] = ; //ans2[i]=(1-1/p1)*(1-1/p2)*...*(1-1/pi)
for(LL i=; i<n;i++) //又(1-1/pi)=((pi-1)/pi)
{
if(pr[i])
{
ans2[i] = ans2[i-] * (i - ) % MOD;
ans2[i] = ans2[i] * inv[i % MOD] % MOD;
}
else
{
ans2[i] = ans2[i-];
}
}
} int main()
{
scanf("%d%d",&T,&MOD);
isprime(MMX);
calc_inv(MMX);
calc_fac(MMX);
calc_eul(MMX);
while (T--)
{
scanf("%d%d",&N,&M);
//ans=(N!/M!)*f(M!)
// =N!*[(1-1/p1)*...*(1-1/pi)]
LL ans=fa[N]*ans2[M]%MOD;
printf("%lld\n",ans);
} return ;
}
最后过得好险= =
| 771794 | i386DX | 2186 | Accepted | 244956 kb | 11312 ms | C++/Edit | 1653 B | 2014-11-04 23:34:15 |
BZOJ2186 欧拉函数的更多相关文章
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑 欧拉函数
题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- COGS2531. [HZOI 2016]函数的美 打表+欧拉函数
题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...
- poj2478 Farey Sequence (欧拉函数)
Farey Sequence 题意:给定一个数n,求在[1,n]这个范围内两两互质的数的个数.(转化为给定一个数n,比n小且与n互质的数的个数) 知识点: 欧拉函数: 普通求法: int Euler( ...
- 51Nod-1136 欧拉函数
51Nod: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136 1136 欧拉函数 基准时间限制:1 秒 空间限制: ...
- 欧拉函数 - HDU1286
欧拉函数的作用: 有[1,2.....n]这样一个集合,f(n)=这个集合中与n互质的元素的个数.欧拉函数描述了一些列与这个f(n)有关的一些性质,如下: 1.令p为一个素数,n = p ^ k,则 ...
- FZU 1759 欧拉函数 降幂公式
Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000 ...
随机推荐
- vuejs使用技巧
组件创建自定义标签时,自定义的标签不要用驼峰写法,vue否者报错,例如<my-template></my-template>合法或者去掉中间的斜杠全部小写,只要出现大写字母就会 ...
- iOS页面传值方式
普遍传值方式如下: 1.委托delegate方式: 2.通知notification方式: 3.block方式: 4.UserDefault或者文件方式: 5.单例模式方式: 6.通过设置属性,实现页 ...
- RDLC使用手册_RDLC报表部署
原文:http://blog.csdn.net/lwjnumber/article/details/6590545 9. RDLC报表部署(限于rdlc报表 windows应用程序) 1) R ...
- C++ c++与C语言的区别(实用性增强,register关键字增强,全局变量检测增强)
//区别①:实用性增强 #include<iostream> using namespace std; //C语言中的变量都必须在作用域开始的位置定义!! //C++中更强调语言的“实用性 ...
- ZooKeeper学习第八期——ZooKeeper伸缩性
一.ZooKeeper中Observer 1.1 ZooKeeper角色 经过前面的介绍,我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower.Leader可以接受 ...
- MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)
振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...
- WireShark系列: 使用WireShark过滤条件抓取特定数据流(zz)
应用抓包过滤,选择Capture | Options,扩展窗口查看到Capture Filter栏.双击选定的接口,如下图所示,弹出Edit Interface Settints窗口. 下图显示了Ed ...
- 流程引擎Activiti系列:在eclipse中搭建咖啡兔的Activiti演示工程中的各种坑及其解决方法(kft-activiti-demo-no-maven)
近期在学习activiti,打算基于现有的框架,比如activiti-explorer或者咖啡兔的示例工程 kft-activiti-demo,在此基础上添加自己的业务流程,看看是否可以走通,以及这个 ...
- C#基础之IL
1.实例解析IL 作为C#程序员,IL的作用不言而喻,首先来看一个非常简单的程序和它的IL解释图,通过这个程序的IL指令来简单的了解常见的IL指令是什么意思. class Program { stat ...
- jsp中常用操作字符串的el表达式
由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 准备工作:1)导入jar包:standard.jar和jstl.jar2) ...