zoukankan      html  css  js  c++  java
  • 1.花
    (flower.cpp/c/pas)
    【问题描述】
    商店里出售n种不同品种的花。为了装饰桌面,你打算买m支花回家。你觉得放两支一样的花很难看,因此每种品种的花最多买1支。求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值。
    【输入格式】
    一行3个整数n,m,p,意义如题所述。
    【输出格式】
    一个整数,表示买花的方案数。
    【输入输出样例1】
    flower.in
    4 2 5
    flower.out
    1
    【输入输出样例1说明】
    用数字1,2,3,4来表示花的种类的话,4种花里买各不相同的2支的方案有(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4),共6种方案,模5后余数是1。
    【数据范围】
    对于30%的数据,n,m≤10
    对于50%的数据,n,m≤1000
    对于80%的数据,1≤m≤n≤50,000
    对于100%的数据,1≤m≤n≤1,000,000,p≤1,000,000,000

    /*
    求C(m,n)%p的值.
    P不一定为素数(不然卢卡斯定理直接).
    质因数分解一开始80分.
    然后加个特判就过了orz.
    判断X是否为素数.
    若是则直接x的幂数+1.
    但是不能直接判断(如图)
    因为素数很少这样会卡常数.
    */
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define MAXN 1000001
    #define LL long long
    using namespace std;
    int n,m,p,tot,a[MAXN],b[MAXN],s[MAXN];
    LL ans=1;
    bool f[MAXN];
    void pre()
    {
        for(int i=2;i<=MAXN-1;i++)
        if(!f[i])
          for(int j=i+i;j<=MAXN-1;j+=i)
            f[j]=true;
        for(int i=2;i<=MAXN-1;i++)
          if(!f[i]) s[++tot]=i,b[i]=tot;
    }
    void slove(int x)
    {
        /*
        if(!f[x]) {
                a[b[x]]++;return ;
            }
        */
        for(int i=1;i<=tot;i++)
          {
            while(x%s[i]==0) x/=s[i],a[i]++;
            if(!f[x]) {
                a[b[x]]++;return ;
            }
            if(x==1) return ;
          }
    }
    void slove2(int x)
    {
        if(!f[x]) {
                a[b[x]]--;return ;
            }
        for(int i=1;i<=tot;i++)
          {
            while(x%s[i]==0) x/=s[i],a[i]--;
            if(!f[x]) {
                a[b[x]]--;return ;
            }
            if(x==1) return ;
          }
    }
    int mi(int x,int y)
    {
        LL sum=1;
        while(y)
        {
            if(y&1) sum=sum*x;
            x=x*x;
            y>>=1;
        }
        return sum;
    }
    int main()
    {
        freopen("flower.in","r",stdin);
        freopen("flower.out","w",stdout);
        pre();
        scanf("%d%d%d",&n,&m,&p);
        for(int i=2;i<=n;i++) 
        slove(i);
        for(int i=2;i<=m;i++)
        slove2(i);
        for(int i=2;i<=n-m;i++) slove2(i);
        for(int i=1;i<=tot;i++)
        {
            int x=mi(s[i],a[i]);
            ans=ans*x%p;
        }
        cout<<ans%p;
        return 0;
    }
    /*
    跑得飞快...
    求阶乘里有几个素数有别的方法
    n!里p的个数=n/p+n/p*p+n/p*p*p.....知道p==n.
    orz ylf&&dmh.
    */
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define MAXN 1000001
    #define LL long long
    using namespace std;
    int n,m,tot,p,a[MAXN],s[MAXN];
    LL ans=1;
    bool f[MAXN];
    void pre()
    {
        for(int i=2;i<=MAXN-1;i++)
        if(!f[i])
          for(int j=i+i;j<=MAXN-1;j+=i)
            f[j]=true;
        for(int i=2;i<=MAXN-1;i++)
          if(!f[i]) s[++tot]=i;
    }
    LL mi(LL x,LL y)
    {
        LL sum=1;
        while(y)
        {
            if(y&1) sum=sum*x%p;
            x=x*x%p;
            y>>=1;
        }
        return sum%p;
    }
    int main()
    {
        freopen("flower.in","r",stdin);
        freopen("flower.out","w",stdout);
        LL x;
        pre();
        scanf("%d%d%d",&n,&m,&p);
        for(int i=1;i<=tot;i++)
        {
            x=s[i];
            while(x<=n){
                a[i]+=n/x;
                x*=s[i];
            }
        }
        for(int i=1;i<=tot;i++)
        {
            x=s[i];
            while(x<=m){
                a[i]-=m/x;
                x*=s[i];
            }
        }
        for(int i=1;i<=tot;i++)
        {
            x=s[i];
            while(x<=n-m){
                a[i]-=(n-m)/x;
                x*=s[i];
            }
        }
        for(int i=1;i<=tot;i++)
          ans=ans*mi(s[i],a[i])%p;
        cout<<ans%p;
        return 0;
    }
  • 相关阅读:
    effective C++ 条款 46:需要类型转换时请为模板定义非成员函数
    effective C++ 条款 42:了解typename的双重意义
    effective C++ 条款 38:通过复合塑模出hasa或“根据某物实现出”
    effective C++ 条款 44:将与参数无关的代码抽离templates
    职场女性工作的六大禁忌
    正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起
    C# 截图 窗体截图 屏幕截图
    C# 创建DataSet 实例
    c# WinForm 中鼠标控制窗体的移动
    访问用户控件里面的控件的两种方法
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068199.html
Copyright © 2011-2022 走看看