本文为博主原创文章,欢迎转载,请注明出处 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]沙拉公主的困惑 线性筛 素数+欧拉的更多相关文章

  1. [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂

    Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...

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

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

  3. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

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

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

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

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

  6. [洛谷P3383][模板]线性筛素数-欧拉筛法

    Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...

  7. P2158 [SDOI2008]仪仗队 线性筛(欧拉函数和素数表)

    上三角行恰好是[1,n-1]的欧拉函数 http://www.luogu.org/problem/show?pid=2158#sub //#pragma comment(linker, "/ ...

  8. 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结

    欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...

  9. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

随机推荐

  1. jxl 导入导出Excel(有模板)

    1.导入 @Override public String importBusinessScope(File file, String unit_id) throws Exception { Workb ...

  2. [洛谷0925]NOIP模拟赛 个人公开赛 OI

     P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个 ...

  3. QFileDialog关于选择文件对话框中的几个信号的说明(currentChanged,directoryEntered,fileSelected,filterSelected)

    QFileDialog关于选择文件对话框中的几个信号 实例: openFile::openFile(QWidget *parent) :QWidget(parent),ui(new Ui::openF ...

  4. Django day01 web应用程序 , http协议

    一:web应用程序1.什么是web应用程序 是一种可以通过web访问的应用程序,最大的好处就是, 只要有浏览器,用户就能很容易访问到应用程序 2. web应用程序的优缺点 缺点: 应用程序强调了浏览器 ...

  5. layui富文本编译器添加图片

    1.创建富文本编辑器 <form class="layui-form" method="post" id="myForm" encty ...

  6. Redis(六)-数据类型

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) string是redis最 ...

  7. Coursera公开课-Machine_learing:编程作业5

    Regularized Linear Regression and Bias/Variance 大多数时候,我们使用机器学习方法得到的结果都不是特别理想,常见 欠拟合 和 过拟合 问题.通过一些变量画 ...

  8. [转载]cocos2d-触摸分发原理

    本文由泰然翻译组组长 TXX_糖炒小虾 原创,版权所有,转载请注明出处并通知作者和泰然! 原作 http://www.ityran.com/archives/1326/comment-page-1 触 ...

  9. 利用 html+css 画同心圆(concentric circles)——绝对布局与相对布局

    一.css 绘制圆 #circle { width: 300px; height: 300px; background-color: #000000; border-radius: 300px; } ...

  10. Android 复制文本内容到系统剪贴板(自由复制)

    直接上代码:(对应的类:android.content.ClipboardManager) //获取剪贴板管理器: ClipboardManager cm = (ClipboardManager) g ...