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 ...
随机推荐
- 前端MVC学习总结(四)——NodeJS+MongoDB+AngularJS+Bootstrap书店示例
这章的目的是为了把前面所学习的内容整合一下,这个示例完成一个简单图书管理模块,因为中间需要使用到Bootstrap这里先介绍Bootstrap. 示例名称:天狗书店 功能:完成前后端分离的图书管理功能 ...
- xampp 用phpmyadmin在页面上修改密码后,无法登陆,密码没问题
xampp 用phpmyadmin在页面上修改密码后,无法登陆,密码没问题一直提示密码错误, 什么原因? ------解决方案--------------------改了密码之后,phpmyadmin ...
- 使用Loadrunner进行http接口压力测试
业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...
- MongoDB学习(四)客户端工具备份数据库
在上一篇MongoDB学习(三)中讲解了如何在服务器端进行数据的导入导出与备份恢复,本篇介绍下如何利用客户端工具来进行远程服务器的数据备份到本地. 以客户端工具MongoVUE为例来进行讲解: 1.首 ...
- R之字符串连接函数paste
函数paste的一般使用格式为: paste(..., sep = " ", collapse = NULL) 其中...表示一个或多个R可以被转化为字符型的对象:参数sep表示分 ...
- CSS3中的字体rem
rem和em都是相对单位,em相对父元素的font-size来计算,而rem是根据文档根元素(html)的font-size大小来计算的 通常将html的字体大小设为62.5%(等于10px),当然也 ...
- jenkins忘记管理员登陆密码的补救措施
jenkins可以作为我们日常运维过程中代码上线的发版平台,所以对jenkins的安全可靠的维护是十分重要的. 1)在登陆jenkins的时候,如果忘记普通用户的登陆密码,只要能用管理员账号登陆,还可 ...
- 001医疗项目-项目框架的搭建(四个maven工程)
这个项目资料来源于传智播客.用的是ssm框架, 我们首先建立一个working sets里面存放,我们的maven工程. 如下:
- 系统级IO实践学习记录
代码分析 cp1.c 功能:复制文件. #include <stdio.h>#include <stdlib.h>#include <unistd.h>#inclu ...
- 直接修改托管堆栈中的type object pointer(类型对象指针)
都知道.NET是一个强对象类型的框架. 那么对于对象类型又是怎么确定的呢. 最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的) 我们知道引用对象存储在托管堆栈中, ...