NYOJ127 星际之门(最小生成数的个数+高速幂)
Posted zsychanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于NYOJ127 星际之门(最小生成数的个数+高速幂)的主要内容,如果未能解决你的问题,请参考以下文章