zoukankan      html  css  js  c++  java
  • NP

    题目描述 LYK 喜欢研究一些比较困难的问题,比如 np 问题。 这次它又遇到一个棘手的 np 问题。

    问题是这个样子的:有两个数 n 和 p,求 n 的阶乘 对 p 取模后的结果。

    LYK 觉得所有 np 问题都是没有多项式复杂度的算法的,所以它打算求助即将要参加 noip 的你,帮帮 LYK 吧!

    输入格式(np.in) 输入一行两个整数 n,p。

    输出格式(np.out) 输出一行一个整数表示答案。

    输入样例 3 4 输出样例 2

    数据范围 对于 20%的数据:n,p<=5。

    对于 40%的数据:n,p<=1000。

    对于 60%的数据:n,p<=10000000。

    对于 80%的数据:n<=10^18,p<=10000000。

    对于另外 20%的数据:n<=10^18,p=1000000007。

    其中大致有 50%的数据满足 n>=p。

    思路:

      对于小的n,或者P<=N 的情况,是很容易做出的。

      但对于n< p  而p=1000000007 的时候,直接跑是不行了。

      先预处理,1e7 *i (1<=i<100)  对P取余的结果 ,就一百个数。

        然后 对于这之间的数可以1e7内得到

    打表

    #include<iostream>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    long long n,p,ans=1;
    int main()
    {    
        freopen("a.out","w",stdout);
        n=10000000;p=1000000007;
        for(long long j=1;j<=100;j++)
        {
            for(long long  i=n*(j-1)+1;i<=n*j;i++)        
                ans=(ans*i)%p;        
            cout<<ans<<',';
        }
        return 0;
    }

    程序

    #include<iostream>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    long long n,p,ans=1,now;
    const int a[100]={682498929,491101308,76479948,723816384,67347853,27368307,625544428,199888908,888050723,927880474,
    281863274,661224977,623534362,970055531,261384175,195888993,66404266,547665832,109838563,933245637,724691727,
    368925948,268838846,136026497,112390913,135498044,217544623,419363534,500780548,668123525,128487469,30977140,
    522049725,309058615,386027524,189239124,148528617,940567523,917084264,429277690,996164327,358655417,568392357,
    780072518,462639908,275105629,909210595,99199382,703397904,733333339,97830135,608823837,256141983,141827977,
    696628828,637939935,811575797,848924691,131772368,724464507,272814771,326159309,456152084,903466878,92255682,
    769795511,373745190,606241871,825871994,957939114,435887178,852304035,663307737,375297772,217598709,624148346,
    671734977,624500515,748510389,203191898,423951674,629786193,672850561,814362881,823845496,116667533,256473217,
    627655552,245795606,586445753,172114298,193781724,778983779,83868974,315103615,965785236,492741665,377329025,
    847549272,698611116};
    int main()
    {
        freopen("np.in","r",stdin);
        freopen("np.out","w",stdout);
        cin>>n>>p;
        if(n>=p)
        {
            cout<<0;
            return 0;        
        }
        if(p==1000000007)
        {
            if(n<10000000) now=1;
            else  now=a[n/10000000-1];
            for(int i=n/10000000*10000000+1;i<=n;i++)
              now=(now*i)%p;
            cout<<now;
            return 0;
        }
        for(long long i=2;i<=n;i++)
        {
            ans=(ans*i)%p;
            if(!ans)
            {
                cout<<0;
                return 0;
            }
        }
        cout<<ans;
        return 0;
    }

      

  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7634132.html
Copyright © 2011-2022 走看看