快速幂
快速幂
题目描述
输入 b,p,kb,p,k 的值,求 bpmodkbpmodk 的值。其中 2≤b,p,k≤1092≤b,p,k≤109 。
输入描述
三个整数 b,p,kb,p,k。
输出描述
输出 bpmodk=sbpmodk=s,ss 为运算结果。
输入输出样例
示例
输入
2 10 9
输出
7
运行限制
-
最大运行时间:1s
-
最大运行内存: 128M
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] g = br.readLine().split("\s+"); // 修复:支持多个空格
int a = Integer.parseInt(g[0]);
int p = Integer.parseInt(g[1]);
int k = Integer.parseInt(g[2]);
quickMi(a, p, k);
}static void quickMi(long a, long p, long mod) { long res = 1; while (p > 0) { if ((p & 1) == 1) { res = res * a % mod; } a = a * a % mod; p = p >> 1; } System.out.println(res % mod); }}
费马小定理

乘法逆元
乘法逆元
题目描述
给定一个正整数 NN,求它在模 109+7109+7 下的乘法逆元。
输入描述
第 11 行为一个整数 TT,表示测试数据数量。
接下来的 TT 行每行包含一个正整数 NN。
1≤T≤1051≤T≤105,1≤N≤1091≤N≤109。
输出描述
输出共 TT 行,每行包含一个整数,表示答案。
输入输出样例
示例 1
输入
5
1
2
3
4
5
输出
1
500000004
333333336
250000002
400000003
运行限制
-
最大运行时间:1s
-
最大运行内存: 128M
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;public class Main {
static int N = 1000010,mod=(int)1e9+7;// static int prime[]=new int[N];
// static int mi[]=new int[N];
// static int ind;public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t=Integer.parseInt(br.readLine());// String g[] = br.readLine().split(" ");
// int a=Integer.parseInt(g[0]),p=Integer.parseInt(g[1]),k=Integer.parseInt(g[2]);
BigInteger m=BigInteger.valueOf(mod);
for (int i = 0; i < t; i++) {
int n=Integer.parseInt(br.readLine());
BigInteger aBigInteger=BigInteger.valueOf(n);
System.out.println(aBigInteger.modInverse(m).toString());
}
// quickMi(a,p,k);}}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {
static int N = 1000010,mod=(int)1e9+7;// static int prime[]=new int[N];
// static int mi[]=new int[N];
// static int ind;public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t=Integer.parseInt(br.readLine());// String g[] = br.readLine().split(" ");
// int a=Integer.parseInt(g[0]),p=Integer.parseInt(g[1]),k=Integer.parseInt(g[2]);for (int i = 0; i < t; i++) { int n=Integer.parseInt(br.readLine()); // a x =1 (mod) // a x= a^(p-1) // x=a^(p-2) quickMi(n,mod-2,mod); } } static void quickMi(long a,long p,long mod){ long res=1; while(p>0){ if((p&1)==1){ res=res*a%mod; } a=a*a%mod; p=p>>1; } System.out.println(res%mod); }}
约数的个数
问题描述0约数的个数 - 蓝桥云课
给定长度为 nn 的序列 aa,输出 ∏i=1naii=1∏nai 的约数个数。结果对 109+7109+7 取模。
输入格式
第一行输入包含一个正整数 nn。(1≤n≤100)(1≤n≤100)
第二行输入包 nn 个数字 aiai。(1≤ai≤2×109)(1≤ai≤2×109)
输出格式
输出 ∏i=1naii=1∏nai 的约数个数。结果对 109+7109+7 取模。
样例输入
4
2 4 5 6
样例输出
20
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int N = 1000010,mod=(int)1e9+7;
// static int prime[]=new int[N];
// static int mi[]=new int[N];
// static int ind;
static Map<Integer, Integer> map=new HashMap<Integer, Integer>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
String g[] = br.readLine().split(" ");
// int a=Integer.parseInt(g[0]),p=Integer.parseInt(g[1]),k=Integer.parseInt(g[2]);
for (int i = 0; i < n; i++) {
int num=Integer.parseInt(g[i]);
total(num);
}
long res=1;
for(int key:map.keySet()){
res=res*(map.get(key)+1)%mod;
}
System.out.println(res);
}
static void total(int num){
int n=num;
for (int i = 2; i*i <= num; i++) {
if(n%i==0){
while(n%i==0){
map.put(i, map.getOrDefault(i, 0)+1);
n/=i;
}
}
}
if(n>1)map.put(n,map.getOrDefault(n,0)+1);
}
}
欧拉函数模板



问题描述
这是一道模板题。
首先给出欧拉函数的定义:即 Φ(n)Φ(n) 表示的是小于等于 nn 的数中和 nn 互质的数的个数。
比如说 Φ(6)=2Φ(6)=2,当 nn 是质数的时候,显然有 Φ(n)=n−1Φ(n)=n−1。
题目大意:
给定 nn 个正整数,请你求出每个数的欧拉函数。
输入格式
输入共两行。
第一行输入一个整数表示 nn 。
第二行输入 nn 个整数。
输出格式
输出共 nn 行,每行输出 11 个整数表示对应数字的欧拉函数。
样例输入
3
3 6 8
样例输入
2
2
4
说明
小于等于 33 的数中与 33 互质的有:1,21,2。
小于等于 66 的数中与 66 互质的有:1,51,5。
小于等于 88 的数中与 88 互质的有:1,3,5,71,3,5,7。
评测数据规模
保证对于所有数据有:
1≤n≤1001≤n≤100,输入的 nn 个整数范围为 1,2×1091,2×109 。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int N = 1000010,mod=(int)1e9+7;
// static int prime[]=new int[N];
// static int mi[]=new int[N];
// static int ind;
static Map<Integer, Integer> map=new HashMap<Integer, Integer>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
String g[] = br.readLine().split(" ");
// int a=Integer.parseInt(g[0]),p=Integer.parseInt(g[1]),k=Integer.parseInt(g[2]);
for (int i = 0; i < n; i++) {
int num=Integer.parseInt(g[i]);
clac(num);
}
}
static void clac(long num){
long res=num;
for (int i = 2; i*i <= num; i++) {
if(num%i==0){
res=res/i*(i-1);
while(num%i==0){
num/=i;
}
}
}
if(num>1)res=res/num*(num-1);
System.out.println(res);
}
}
矩阵快速幂
问题描述
一个 m×nm×n 的矩阵是一个由 mm 行 nn 列元素排列成的矩形阵列。即形如
A=a11a12⋯a1na21a22⋯a2n⋮⋮⋱⋮am1am2⋯amn.A=⎣⎢⎢⎢⎢⎡a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎦⎥⎥⎥⎥⎤.
给定一个 n⋅nn⋅n 的矩阵 AA,求解 AkAk,每个元素需对 109+7109+7 取模。
输入格式
第一行输入 22 个正整数 n,kn,k。
接下来 nn 行,每行 nn 个正整数,表示矩阵的具体元素。
输出格式
输出 nn 行,每行 nn 个正整数,第 ii 行第 jj 个数表示 (Ak)i,j(Ak)i,j,每个元素对 109+7109+7 取模。
样例输入
3 3
1 2 3
4 5 6
7 8 9

样例输出
468 576 684
1062 1305 1548
1656 2034 2412
评测数据规模
1≤n≤100,0≤k≤1012,∣Aij∣≤10001≤n≤100,0≤k≤1012,∣Aij∣≤10
暴力(超时)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int N = 110,mod=(int)1e9+7;
static int a[][]=new int[N][N];
static int back[][]=new int[N][N];
static Map<Integer, Integer> map=new HashMap<Integer, Integer>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// int n=Integer.parseInt(br.readLine());
String g[] = br.readLine().split("\\s+");
int n=Integer.parseInt(g[0]),k=Integer.parseInt(g[1]);
for (int i = 0; i < n; i++) {
g = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
a[i][j]=Integer.parseInt(g[j]);
back[i][j]=a[i][j];
}
}
for (int i = 1; i < k; i++) {
int aa[][]=new int[n][n];
for (int j = 0; j < n; j++) {
aa[j]=Arrays.copyOfRange(a[j],0, n);
}
int c[][]=new int[n][n];//每个新的结果必须从0开始
for (int j = 0; j < n; j++) {
for (int m = 0; m < n; m++) {
for (int l = 0; l < n; l++) {
c[j][m]=(int)(c[j][m]+(long)aa[j][l]*back[l][m])%mod;
//a[j][l]可能被这次更新过了 ,所以a要先备份
}
}
}
for (int j = 0; j < n; j++) {
a[j]=Arrays.copyOfRange(c[j],0, n);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
矩阵快速幂
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N = 110,mod=(int)1e9+7;
static int a[][]=new int[N][N];
//static int back[][]=new int[N][N];
static int ans[][]=new int[N][N];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// int n=Integer.parseInt(br.readLine());
String g[] = br.readLine().split(" ");
int n=Integer.parseInt(g[0]);
long k=Long.parseLong(g[1]);
for (int i = 0; i < n; i++) {
g = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
a[i][j]=Integer.parseInt(g[j]);
}
}
for (int i = 0; i <n; i++) {//定义为单位矩阵
ans[i][i]=1;
}
while(k>0){
if((k&1)==1){
ans=multiple(ans, a);
}
k=k>>1;
a=multiple(a, a);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(ans[i][j]+" ");
}
System.out.println();
}
}
static int[][] multiple(int a[][],int b[][]){
int res[][]=new int[a.length][b[0].length];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b[0].length; j++) {
for (int j2 = 0; j2 < a[0].length; j2++) {
res[i][j]=(int)((res[i][j]+(long)a[i][j2]*b[j2][j])%mod);
}
}
}
return res;
}
}