• NYOJ127 星际之门(一)(最小生成数的个数+高速幂)


    题目描写叙述:

    http://acm.nyist.net/JudgeOnline/problem.php?pid=127

    能够证明。修建N-1条虫洞就能够把这N个星系连结起来。

    如今。问题来了。皇帝想知道有多少种修建方案能够把这N个星系用N-1条虫洞连结起来?

     

    输入
    第一行输入一个整数T,表示測试数据的组数(T<=100)
    每组測试数据仅仅有一行。该行仅仅有一个整数N。表示有N个星系。

    (2<=N<=1000000)

    输出
    对于每组測试数据输出一个整数。表示满足题意的修建的方案的个数。

    输出结果可能非常大,请输出修建方案数对10003取余之后的结果。

    例子输入
    2
    3
    4
    例子输出
    3
    16

    题目分析:

    高速幂+全然图的最小生成树的个数,n个顶点的最小生成树的个数为n^(n-2)。


    AC代码1 O(n):

     
    /**
     *在一个n阶全然图的全部生成树的数量为n的n-2次方
     */
    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<cstdlib>
    #include<cctype>
    #include<cstring>
    #include<cmath>
    #define MOD 10003
    using namespace std;
    int Sum(int n){
        int res=n;
        for(int i=1;i<=n-3;i++){
            res*=n;
            res%=MOD;
        }
        return res;
    }
    int main()
    {
        int n,t;
        cin>>t;
        while(t--){
            cin>>n;
            if(n==2){//仅仅有一中
                cout<<"1"<<endl;
                continue;
            }
            int res=n;
            for(int i=1;i<=n-3;i++){
                res*=n;
                res%=MOD;
            }
            cout<<res<<endl;
        }
    	return 0;
    }
            
    AC代码2 O(logn)

     
    /**
     *在一个n阶全然图的全部生成树的数量为n的n-2次方
     */
    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<cstdlib>
    #include<cctype>
    #include<cstring>
    #include<cmath>
    #define MOD 10003
    using namespace std;
    int Mod(int a,int b)//高速幂
    {
        int ret=1;
        int tmp=a;
        while(b)
        {
           //奇数存在
           if(b&1) ret=ret*tmp%MOD;
           tmp=tmp*tmp%MOD;
           b>>=1;
        }
        return ret;
    }
    int main()
    {
        int n,t;
        cin>>t;
        while(t--){
            cin>>n;
            if(n==2){//仅仅有一中
                cout<<"1"<<endl;
                continue;
            }
            /**
            int res=n;
            for(int i=1;i<=n-3;i++){
                res*=n;
                res%=MOD;
            }
            cout<<res<<endl;
            **/
            cout<<Mod(n,n-2)<<endl;
        }
    	return 0;
    }
            




  • 相关阅读:
    计算函数执行时间
    Go语言生成随机数
    413 Request Entity Too Large
    JavaScript变量与数据类型详解
    OAuth2.0认证详解
    prompt的工作原理
    JS 实现上传图片
    移动端的长按事件的实现
    实现自动关闭当前页面的效果
    前端异常捕获与上报
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6715655.html
Copyright © 2020-2023  润新知