zoukankan      html  css  js  c++  java
  • [欧拉函数] Bzoj P2186 沙拉公主的困惑

    Description

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

    题解

    • gcd(i,m!)=1所以gcd(i+m!,m!)=1
    • 所以每m!个所含的与m!互质的数的个数是一样的
    • 所以φ(m!)*n!/m!
    • 然后就线性筛就好了

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #define N 10000010 
     4 #define ll long long 
     5 using namespace std;
     6 int T,mo,n,m,ans[N],fac[N],inv[N],p[N],bz[N];
     7 int main()
     8 {
     9     scanf("%d%d",&T,&mo),fac[1]=inv[1]=ans[1]=1;
    10     for (int i=2;i<=N;i++) fac[i]=(ll)fac[i-1]*i%mo,inv[i]=(mo-(ll)mo/i*inv[mo%i]%mo);
    11     for (int i=2;i<=N;i++)
    12     {
    13         if (!bz[i]) p[++p[0]]=i;
    14         for (int j=1;p[j]*i<=N&&j<=p[0];j++)
    15         {
    16             bz[p[j]*i]=1;
    17             if (i%p[j]==0) break;
    18         }
    19     }
    20     for (int i=2;i<=N;i++)
    21     {
    22         ans[i]=ans[i-1];
    23         if (!bz[i]) ans[i]=(ll)ans[i]*(i-1)%mo*inv[i%mo]%mo;
    24     }
    25     while (T--) scanf("%d%d",&n,&m),printf("%d
    ",(ll)fac[n]*ans[m]%mo);
    26 }
  • 相关阅读:
    算法提高 道路和航路
    奇偶剪枝
    二分求值
    并查集--路径压缩
    Oracle数据库导入导出DMP文件
    Spring IoC的实现与思考(一)
    sql基础拾遗
    jquery事件函数的使用之focus
    Java动态代理之cglib
    Java se之动态代理
  • 原文地址:https://www.cnblogs.com/Comfortable/p/11319878.html
Copyright © 2011-2022 走看看