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 }
  • 相关阅读:
    listview右边显示 abcd快速选择
    显示密码
    欢迎界面动画
    web get Post测试
    使用MultiDexApplication
    获取当前运行的Activity信息
    MFC得到运行程序路径
    构建之法阅读笔记01
    个人作业1:随机生成四则运算
    软件工程第一步
  • 原文地址:https://www.cnblogs.com/Comfortable/p/11319878.html
Copyright © 2011-2022 走看看