[SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia
[SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
题目大意
给定n,m,求在1到n!内与m!互质的个数,答案要对r取模。
输入格式:
第一行为两个整数T,R。R<=10^9+~~10,T<=10000,表示该组中测试数据数目,R为模 后面T行,每行一对整数n,m,见题目描述 m<=n
输出格式:
共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值
输入输出样例
input
1 11
4 2
output
1
解题分析
首先,我们来引出一个定理
如果a与b互质,那么\(b*k+a\)也与b互质。证明和证明gcd的证明类似。
反过来,我们也可以用\(gcd\)证明,
因为\(gcd(a,b)=1\),所以\(gcd(a\%b,b)=1\)
因为\(a\%b=a-k*b\),故\(gcd(a-k*b,b)=1\),及\(a-k*b\)与\(b\)互质。
根据这个特性,并且\(n>=m\),所以可以将n!分成若干段,每段为m!,每一段中与m!互质的个数都是相等的且等于1到m!中与m!互质的个数
我们可以得到式子
\(ans={\frac{n!}{m!}*\phi(m!)}\)
进一步拆开,我们可以得到 (假设p为m!的质因数,很容易可以知道,p就是所有小于m的素数,r为质因数个数)
\(ans={\frac{n!}{m!}*m!*\frac{\prod \limits_{i=1}^{r}(p_i-1)}{\prod\limits_{i=1}^{r}p_i } \to ans=n!*\frac{\prod \limits_{i=1}^{r}(p_i-1)}{\prod\limits_{i=1}^{r}p_i } }\)
因为\(ans\) 要\(\mod R\),所以我们也要算1到m的逆元,在累乘$\prod\limits_{i=1}^{r}p_i \(,乘的是\)p_i \(的逆元。
有多组询问,我们得先预处理一些数据,累乘的时候要%R
我们令\)k[i] = i! ,inv[i]为i的逆元,\(f1[i]= {\prod\limits_{a=1}^{i}(p_a-1)}\)
$ ,f2[i]={\prod\limits_{a=1}^{i}p_a} \(
\)ans=f1[m]f2[m]k[n]$
先预处理O()答案,对于询问O(1)出解
#include <cstdio>
#include <iostream>
#include <math.h>
using namespace std;
const int MAXN=10000000+10;
bool su[MAXN];
int q[MAXN][2],maxm,maxn,t,inv[MAXN],p,n,m;
int k[MAXN],f1[MAXN],f2[MAXN],ans=0;
void work()
{
inv[1]=1;k[1]=1;f1[1]=1;f2[1]=1;
for(int i=2;i<=sqrt(maxm);i++) if(!su[i])
for(int j=2;j<=maxm/i;j++) su[i*j]=1;
for(int i=2;i<=maxn;i++)
{
if(i<=maxm)
{
inv[i]=(1LL*-(p/i)*inv[p%i])%p;
inv[i]=(inv[i]%p+p)%p;
}
if(i<=maxm)
{
if(!su[i])
{
f1[i]=(1LL*f1[i-1]*((i-1)%p))%p;
f2[i]=(1LL*f2[i-1]*(inv[i]%p))%p;
}else
{
f1[i]=f1[i-1];
f2[i]=f2[i-1];
}
}
k[i]=(1LL*k[i-1]*(i%p))%p;
}
}
int main()
{
scanf("%d%d",&t,&p);
for(int i=1;i<=t;i++)
{
scanf("%d%d",&q[i][0],&q[i][1]);
maxn=max(maxn,q[i][0]);
maxm=max(maxm,q[i][1]);
}
work();
for(int i=1;i<=t;i++)
{
ans=((1LL*k[q[i][0]]%p)*1LL*(f1[q[i][1]]%p))%p;
ans=(ans*1LL*(f2[q[i][1]]%p))%p;
printf("%d\n",ans);
}
return 0;
}
/*
2 11
6 3
10 5
*/
[SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉的更多相关文章
- [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂
Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...
- 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
[BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...
- 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘
P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...
- [洛谷P3383][模板]线性筛素数-欧拉筛法
Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...
- P2158 [SDOI2008]仪仗队 线性筛(欧拉函数和素数表)
上三角行恰好是[1,n-1]的欧拉函数 http://www.luogu.org/problem/show?pid=2158#sub //#pragma comment(linker, "/ ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
随机推荐
- 蒟蒻的trie树专题
POJ 3630 Phone List: 模板 ///meek #include<bits/stdc++.h> using namespace std; using namespace s ...
- user和userdebug区别
user:不可以root userdebug:可以root
- Android updater-scripts(Edify Script)各函数详细说明【转】
本文转载自:http://blog.csdn.net/kwuwei/article/details/40616909 这是Android系统来运行updater-scripts的Edify语言的基本介 ...
- 修改android系统开机动画
本文转载自:http://blog.csdn.net/u012301841/article/details/51598115 修改android系统开机动画
- springboot创建项目
Springboot作为轻量级快速开发受到无数java人的青睐,Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过 ...
- TCP/IP详解(一)
SYN中的MSS选项是告诉对端,本端在本地连接的每个TCP分节中愿意接收的最大数据量.发送端TCP使用接收端的MSS值作为发送分节的最大大小. TCP半关闭使用的情况较少,可用于通知对端本端数据已输入 ...
- (转)Win10 TensorFlow(gpu)安装详解
Win10 TensorFlow(gpu)安装详解 写在前面:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着 ...
- spring事务回滚问题
刚刚接到一个上家公司同事的一个电话,问我为什么service方法事务不会滚了,日志打印了,调用webservice报错. 我让他把这个调用执行webservice的方法截图发给我,如下: publ ...
- REST、RESTful、SOA
1.http://www.imooc.com/article/17650 2.SOA面向服务架构
- Hibernate_01_初体验
hibernate开发的基本步骤: 编写配置文档hibernate.cfg.xml: 编写实体类: 生成对应实体类的映射文件并添加到配置文档中: 调用hibernate API进行测试. Hibern ...