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;
}
        
时间: 2024-12-19 13:42:31

NYOJ127 星际之门(一)(最小生成数的个数+高速幂)的相关文章

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

题目描述: http://acm.nyist.net/JudgeOnline/problem.php?pid=127 可以证明,修建N-1条虫洞就可以把这N个星系连结起来. 现在,问题来了,皇帝想知道有多少种修建方案可以把这N个星系用N-1条虫洞连结起来? 输入 第一行输入一个整数T,表示测试数据的组数(T<=100) 每组测试数据只有一行,该行只有一个整数N,表示有N个星系.(2<=N<=1000000) 输出 对于每组测试数据输出一个整数,表示满足题意的修建的方案的个数.输出结果可能

nyoj-----127星际之门(一)

星际之门(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的地. 帝国皇帝认为这种发明很给力,决定用星际之门把自己统治的各个星系连结在一起. 可以证明,修建N-1条虫洞就可以把这N个星系连结起来. 现在,问题来了,皇帝想知道有多少种修建方案可以把这N个星系用N-1条虫洞连结起来?

NYOJ127 星际之门(一)【定理】

星际之门(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的地. 帝国皇帝认为这种发明很给力,决定用星际之门把自己统治的各个星系连结在一起. 可以证明,修建N-1条虫洞就可以把这N个星系连结起来. 现在,问题来了,皇帝想知道有多少种修建方案可以把这N个星系用N-1条虫洞连结起来?

最小生成数之Kruskal算法

描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成了--小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的). 输入 每个测试点(输入文件)有且仅有一组

【JSOI 2008】【BZOJ 1016】最小生成数计数

这题题目中有一个很显眼的提示,每种权值的边不会超过10条,这提示我们可以采用些暴力方法. 首先在每个最小生成树中有两个结论: 1.每种权值的边数相等. 2.每种权值所选边构建后图的联通形态相同. 1比较好理解,若1不成立,则最小生成树总权值不固定. 2可以通过Kruskal算法流程来理解. code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using

[最小生成数] 还是畅通工程

题目描述 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. 输入 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( < 100 ):随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离.为简单起见,村庄从1到N编号.     

最小生成数(并查集)Kruskal算法

并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 int father[N]; void init() { for(int i=0;i<n;i++) father[i]=1; } void union(int x,int y) //合并两元素所在集合 { x=getfather(x); y=getfather(y); if(x!=y) fathe

最小生成数 克鲁斯卡尔 普里姆 matlab

克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w,1)==size(G.w,2) W=G.w;n=size(W,1); end if isfield(G,'e') && ~isempty(G.e) && size(G.e,2)==3 E=G.e; n=max(max(E(:,1:2)); elseif n==0 error(

次小生成树

次小生成树:所谓的次小生成树,是指在边集与某一最小生成树的边集不完全相同的其它生成树中值最小的那个.因此在数值上,最小生成树可能会等于次小生成树,这种情况也可以看做最小生成数. 思路:最直观的解法是,首先求出最小生成树,并且记录最小生成树中的边,然后再枚举删除最小生成树的边并同时求最小生成树. 以POJ1679为例,Kruskal求次小生成树代码如下: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm>