大视野2186: 沙拉公主的困惑(求逆元)

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

Time Limit: 10 Sec  Memory Limit: 259 MB

Submit: 2616  Solved: 880

[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

[Submit][Status][Discuss]


HOME Back

题意:互质的数的个数,其中

分析:因为,所以,我们很容易知道如下结论

   对于两个正整数,如果的倍数,那么中与互素的数的个数为

     本结论是很好证明的,因为中与互素的个数为,又知道,所以

结论成立。那么对于本题,答案就是

其中为小于等于的所有素数,先筛选出来即可。由于最终答案对一个质数取模,所以要用逆元,这里

求逆元就有技巧了,用刚刚介绍的递推法预处理,否则会TLE的。

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <bitset>

using namespace std;
typedef long long LL;
const int N = 10000005;

bitset<N> prime;

void isprime()
{
    prime.set();
    for(int i=2; i<N; i++)
    {
        if(prime[i])
        {
            for(int j=i+i; j<N; j+=i)
                prime[j] = false;
        }
    }
}

LL ans1[N],ans2[N];
LL inv[N];

int main()
{
    isprime();
    int MOD,m,n,T;
    scanf("%d%d",&T,&MOD);
    ans1[0] = 1;
    for(int i=1; i<N; i++)
        ans1[i] = ans1[i-1] * i % MOD;
    inv[1] = 1;
    for(int i=2;i<N;i++)
    {
        if(i >= MOD) break;
        inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
    }
    ans2[1] = 1;
    for(int i=2; i<N; i++)
    {
        if(prime[i])
        {
            ans2[i] = ans2[i-1] * (i - 1) % MOD;
            ans2[i] = ans2[i] * inv[i % MOD] % MOD;
        }
        else
        {
            ans2[i] = ans2[i-1];
        }
    }
    while(T--)
    {
        scanf("%d%d",&n,&m);
        LL ans = ans1[n] * ans2[m] % MOD;
        printf("%lld\n",ans);
    }
    return 0;
}

接下来还有一个关于逆元的有意思的题目,描述如下

证明:

其中

所以只需要证明,而我们知道的逆元对应全部

中的所有数,既是单射也是满射。

所以进一步得到

证明完毕!

时间: 2024-10-19 18:03:01

大视野2186: 沙拉公主的困惑(求逆元)的相关文章

BZOJ 2186 沙拉公主的困惑(预处理逆元+欧拉函数)

题意:求1-n!里与m!互质的数有多少?(m<=n<=1e6). 因为n!%m!=0,所以题目实际上求的是phi(m!)*n!/m!. 预处理出这些素数的逆元和阶乘的模即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # includ

BZOJ 2186: [Sdoi2008]沙拉公主的困惑 (逆元的应用)

传送门 Problem 2186. – [Sdoi2008]沙拉公主的困惑 2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3058  Solved: 1040[Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大

【BZOJ】2186 沙拉公主的困惑

一道非常有价值的题. [解析1]欧几里德算法求乘法逆元,前缀和 [Analysis]O(T n log n). [Sum] ①int运算,如果会超出界,第一个数前要加上(LL)即类型转换. ②gcd不变的欧几里德定理:可以是加,也可以是减. [Code] /************************************************************** Problem: 2186 User: y20070316 Language: C++ Result: Accept

BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】

题意:求中互质的数的个数,其中. 分析:因为,所以,我们很容易知道如下结论    对于两个正整数和,如果是的倍数,那么中与互素的数的个数为      本结论是很好证明的,因为中与互素的个数为,又知道,所以 结论成立.那么对于本题,答案就是 事实上只要把素数的逆元用exgcd求一求就好,其余并未用到 逆元递推法: #include<stdio.h> #include<string.h> const int N=1e7+112; typedef long long ll; int pr

BZOJ 2186 [Sdoi2008]沙拉公主的困惑 线性逆元

题意:链接 方法:线性筛逆元 解析: SB卡常数题 不想多说什么正常人都会做 ans=?(m!)?n!m! ans=m!?n!m!?∏Pi?1Pi(Pi|m!) ans=n!?∏Pi?1Pi(Pi|m!) ans=n!?∏((Pi?1)?inv[Pi]) 代码: #include<cstdio> #include<cmath> #include<ctime> #include<cstring> #include<iostream> #includ

bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数

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

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

Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可.R是一个质数. Input 第一行为两个整数T,R.R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n Outp

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

2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一 大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可. R是一个质数. Input 第一行为两个整数T,R.R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行

bzoj2186【SDOI2008】沙拉公主的困惑

2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2363  Solved: 779 [Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张