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


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

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 5003  Solved: 1725
    [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


    首先我们由gcd的性质知道互质的数的个数以M!为周期循环

    即gcd(a,b) = gcd(a,b + a)

    所以我们只要求出M!以内与N!互质的个数,乘上N!/M!就可以了

    ans = M! phi(M!) * N! / M! = N! * phi(M!)

    M!包含M以内的所有质数,所以我们用线性筛求出所有质数就可以预处理出所有phi

    求phi时用到除法,可以用逆元递推预处理:inv[i] = P - P / i * inv[P % i] % P

    8s压线过QAQ

     

    #include<cstdio>
    #include<bitset>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define REP(i,n) for (register long long int i = 1; i <= (n); i++)
    using namespace std;
    const int maxn = 10000005,Max = 10000000,maxm = 2000000,INF = 1000000000;
    int fac[maxn],prime[maxm],inv[maxn],sum[maxn],primei = 0,P,N,M,ans;
    bitset<maxn> isn;
    void Pre(){
    	fac[0] = 1;
    	REP(i,Max) fac[i] = (LL)fac[i - 1] * i % P;
    	inv[1] = 1;
    	for (int i = 2 ; i <= Max && i <= P; i++) inv[i] = P - (LL)(P / i) * inv[P % i] % P;
    	sum[0] = 1;
    	for (LL i = 2; i <= Max; i++){
    		if (!isn[i]) prime[++primei] = i;
    		for (int j = 1; j <= primei && (LL)i * prime[j] <= Max; j++){
    			isn[i * prime[j]] = true;
    			if (i % prime[j] == 0) break;
    		}
    	}
    	sum[1] = 1;
    	for (LL i = 2; i <= Max; i++){
    		sum[i] = sum[i - 1];
    		if (!isn[i]) sum[i] = (LL)sum[i] * (i - 1) % P * inv[i] % P;
    	}
    }
    int main(){
    	int T;
    	scanf("%d%d",&T,&P);
    	Pre();
    	while (T--){
    		scanf("%d%d",&N,&M);
    		printf("%lld
    ",(LL)fac[N] * sum[M] % P);
    	}
    	return 0;
    }
    
  • 相关阅读:
    简单理解jQuery中$.getJSON、$.get、$.post、$.ajax用法
    适配器模式(Adapter Pattern)
    什么样的登录框才算是优秀的?
    transient的作用及序列化
    MySQL索引实现原理
    concurrentHashMap原理分析和总结(JDK1.8)
    HashMap实现原理(JDK1.8)
    深入理解Java中的IO
    多线程系列
    多线程系列
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282786.html
Copyright © 2020-2023  润新知