【思维题+大数取模+快速幂】Beautiful Tables美丽的桌子

题目来源: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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值