快速幂、费马小定理、约数的个数、欧拉函数模板、矩阵快速幂

快速幂

快速幂

题目描述

输入 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∏n​ai​ 的约数个数。结果对 109+7109+7 取模。

输入格式

第一行输入包含一个正整数 nn。(1≤n≤100)(1≤n≤100)

第二行输入包 nn 个数字 aiai​。(1≤ai≤2×109)(1≤ai​≤2×109)

输出格式

输出 ∏i=1naii=1∏n​ai​ 的约数个数。结果对 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=⎣⎢⎢⎢⎢⎡​a11​a21​⋮am1​​a12​a22​⋮am2​​⋯⋯⋱⋯​a1n​a2n​⋮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;
    }
}
相关推荐
hyunbar1 小时前
NOT IN 的 NULL 陷阱:一次 UNION 数据“神秘消失“
开发语言·sql
C+++Python1 小时前
如何在 Java 中使用 BIO、NIO 和 AIO?
java·开发语言·nio
189228048611 小时前
NV022固态MT29F16T08GWLCEM5-QBES:C
c语言·开发语言
划水的code搬运工小李2 小时前
下载CSDN到PDF
开发语言·pdf·swift
不负岁月无痕2 小时前
STL-- C++ stack_queue _priority_queue类 模拟实现
开发语言·c++
半个烧饼不加肉2 小时前
JS 底层探究--上下文
开发语言·javascript·ecmascript
小满Autumn2 小时前
依赖注入设计模式速查手册
开发语言·c#·wpf·mvvm·依赖注入
周末也要写八哥2 小时前
浅谈:C++中cpp 14 ~ cpp 17
开发语言·c++·算法
不会C语言的男孩2 小时前
C++ Primer 第13章:拷贝控制
开发语言·c++