题目来源:http://codeforces.com/gym/101733/problem/C
题目大意:给定n*n的矩阵,在矩阵上面的每一个格子可以取1-n的值,问使得矩阵每行每列都能被n整除,求不同矩阵的个数mod10^9+7
题目分析:对于左上角(n-1)* (n-1)的子方阵有n^((n-1)*(n-1))个组合,且最后一行一列有唯一解。注意大数取模方法。
学习自:https://www.cnblogs.com/skyette/p/8452439.html
import java.util.Scanner;
public class Main{
static Scanner input = new Scanner(System.in);
public static void main(String[] args){
int x = input.nextInt();
System.out.print(pow(x,(x-1)*(x-1)));
}
static long pow(long base,int time){
long ans = base;
while(time>=2){
time--;
ans = ans*base%1000000007;
}
return ans;
}
}
这一题如果本身给的n的上限是1000,所以直接用大数取模的方法就可以做出来,但是如果是10000以上的话就要用快速幂。大数取模n=10000就要3000ms,快速幂n=1000000000也只用100ms。
快速幂解题方法:
import java.util.Scanner;
public class Main{
static Scanner input = new Scanner(System.in);
public static void main(String[] args){
int n = input.nextInt();
System.out.println(quick(n,(n-1)*(n-1),1000000007));
}
static long quick(long a,long b,long c){
long ans = 1;
while(b!=0){
if(b%2==1){
ans = (ans*a)%c;
}
a = (a*a)%c;
b=b>>1;
}
return ans;
}
}
快速幂总结传送门:http://blog.csdn.net/lvlinfeng970/article/details/79634521