🌸数论基本模板
 
🍂闰年
 
public class Text {
	public static void main(String
[] args
) {
		
	
	}
    static boolean isloop(int x
) {
        return x
%400==0 || (x
%4==0 && x
%100!=0);
    }
}
 
🍂求某年某月某日是星期几
 
public static int whatDay(int year
, int month
, int day
){
    if(m 
<= 2){
        y
--;
        m 
+= 12;
    }
    return (day 
+ 2 * month 
+ 3 * (month 
- 1) / 5 + y 
+ y 
/ 4 - y 
/ 100 + y 
/ 400) % 7 + 1;
}
 
🍂求当年到当前天具体有多少天
 
public static int calDays(int year
, int month
, int day
){
    int sum 
= 0;
    int[] month 
= {0, 31,28,31,30,31,30,31,31,30,31,30,31};
    if(isLeap(year
)){
        month
[2]++;
    }
    for(int i
= 1; i 
< m
; i
++){
        sum 
+= month
[i
];
    }
    return sum 
+ day
;
}
 
🍂求距离公元一年一月一日的天数
 
public static int days(int y
, int m
, int d
){
    int c 
= calDays(y
, m
, d
);
    return 365 * (y 
- 1) + (y 
- 1) / 4 - (y 
-  1) / 100 + (y 
- 1) / 400 + c
;
}
 
🍂素数
 
    static boolean isPrim(int n
) {
        if(n
==1)
            return false;
        for(int i
=2;i
*i
<=Math
.sqrt(n
);i
++)
            if(n
%i
==0)
                return false;
 
        return true;
    }
        boolean[] is 
= new boolean[1000005];
        is
[1] = true;
        for(int i
=2;i
<1000005;i
++)
            if(!is
[2])
                for(int j
=2*i
;j
<1000005;j
+=i
)
                    is
[j
] = true;
        System
.out
.println(is
[2004]);
 
🍂gcd和lcm
 
public class Text {
	public static void main(String
[] args
) {
		
	}
    static int gcd(int a
,int b
) {
        return b
==0?a
:gcd(b
,a
%b
);
    }
    static int lcm(int a
,int b
) {
        return a
*b
/gcd(a
,b
);
    }
}
 
🍂扩展欧几里得
 
	static int x
, y
;
	public static int exgcd(int a
, int b
) {
		if(b 
== 0) {
			x 
= 1;
			y 
= 0;
			return a
;
		}
		int d 
= exgcd(b
, a 
% b
);
		int t 
= y
;
		y 
= x 
- a 
/ b 
* y
;
		x 
= t
;
		return d
;
	}
 
🍂n阶行列式
 
import java
.io
.BufferedReader
;
import java
.io
.BufferedWriter
;
import java
.io
.IOException
;
import java
.io
.InputStreamReader
;
import java
.io
.OutputStreamWriter
;
public class Text {
	static BufferedReader in 
= new BufferedReader(new InputStreamReader(System
.in
));
	static BufferedWriter out 
= new BufferedWriter(new OutputStreamWriter(System
.out
));
	
	public static int Int(String s
) {
		return Integer
.parseInt(s
);
	}
	
	public static void copy(int[][] A
, int[][] A1
, int i
, int len
) {
		for(int x 
= 1; x 
< len
; x
++) {
			for(int y 
= 0, j 
= 0; j 
< len
; j
++) {
				if(j 
!= i
) {
					A1
[x 
- 1][y
++] = A
[x
][j
];
				}
			}
		}
	}
	
	public static int F(int[][] A
, int len
) {
		int res 
= 0;
		if(len 
== 1) {
			return A
[0][0];
		}
		if(len 
== 2) {
			return A
[0][0] * A
[1][1] - A
[0][1] * A
[1][0];
		}else {
			int A1
[][] = new int[10][10];
			for(int i 
= 0; i 
< len
; i
++) {
				copy(A
, A1
, i
, len
);
				res 
+= Math
.pow(-1, i
) * A
[0][i
] * F(A1
, len 
- 1);
			}
		}
		return res
;
	}
	public static void main(String
[] args
) throws NumberFormatException
, IOException 
{
		int n
;
		n 
= Integer
.parseInt(in
.readLine());
		
		int arr
[][] = new int[10][10];
		for(int i 
= 0; i 
< n
; i
++) {
			String
[] s 
= in
.readLine().split(" ");
			for(int j 
= 0; j 
< n
; j
++) {
				arr
[i
][j
] = Int(s
[j
]);
			}
		}
		out
.write(F(arr
, n
) + "\n");
		out
.flush();
	}
}
 
🍂进制问题
 
如有价值1,2,4,8等价值的硬币,如何用最小的硬币数凑出100元
 
    static int f(int n
,int k
) {
        int ans
=0;
        String s 
= Integer
.toString(n
, k
);
        System
.out
.println(s
);
        for(int i
=0;i
<s
.length();i
++)
            ans
+=s
.charAt(i
)-'0';
 
        return ans
;
    }
 
🍂找钱问题
 
共1024,64,16,4,1几种面值
 
 static void solve(){
         Scanner cin 
= new Scanner(System
.in
);
 int N 
= 1024-cin
.nextInt(), ans 
= 0;
 for(int i
=0; i
<4; i
++){
             ans 
+= N
/arr
[i
];
             N 
%= arr
[i
];
         }
         System
.out
.println(ans
);
     }
 
🍂括号匹配
 
    public boolean isValid(String s
) {
        if(s
==null
||s
.equals(""))
            return true;
 
        char[] ch 
= s
.toCharArray();
        Stack
<Character> stack 
= new Stack<>();
        
        for(int i
=0;i
<ch
.length
;i
++)
        {
            if(ch
[i
]=='(' || ch
[i
]=='[' || ch
[i
]=='{')
                stack
.push(ch
[i
]);
            else if(ch
[i
]==')' || ch
[i
]==']' || ch
[i
]=='}')
            {
                if(!stack
.isEmpty())
                {
                    char p 
= stack
.pop();
                    if(p
=='(' && ch
[i
]==')')
                        continue;
                    if(p
=='[' && ch
[i
]==']')
                        continue;
                    if(p
=='{' && ch
[i
]=='}')
                        continue;
                }
                return false;
            }
        }
        
        return stack
.empty();
    }
 
🍂快速幂
 
求a^n
 
public class Text {
	private static long MOD 
= 1000000007;
	public static void main(String
[] args
) {
		
	}
	public static long mpow(long a
, long n
) {
		if(n 
== 0 || a 
== 1) {
			return 1;
		}
		long ans 
= 1;
		while(n 
!= 0) {
			if(n 
% 2 == 1) {
				ans 
= a 
* ans 
% MOD
;
			}
			a 
= a 
* a 
% MOD
;
			n 
>>= 1;
		}
		return ans
;
	}
}
 
🍂矩阵乘法
 
public class Text {
	private static int MOD 
= 100000007;
	public static void main(String
[] args
) {
	}
	static int[][] mul(int[][] a
, int[][] b
) {
		int n 
= a
.length
;
		int[][] ans 
= new int[n
][n
];
		for (int i 
= 0; i 
< n
; i
++)
			for (int j 
= 0; j 
< n
; j
++)
				for (int k 
= 0; k 
< n
; k
++)
					ans
[i
][j
] = (ans
[i
][j
] + a
[i
][k
] * b
[k
][j
]) % MOD
;
		return ans
;
	}
}
 
🍂矩阵快速幂
 
public class Text {
	public static void main(String
[] args
) {
		
	}
	private static int MOD 
= 100000007;
	static int[][] mul(int[][] a
, int[][] b
) {
		int n 
= a
.length
;
		int[][] ans 
= new int[n
][n
];
		for (int i 
= 0; i 
< n
; i
++)
			for (int j 
= 0; j 
< n
; j
++)
				for (int k 
= 0; k 
< n
; k
++)
					ans
[i
][j
] = (ans
[i
][j
] + a
[i
][k
] * b
[k
][j
]) % MOD
;
		return ans
;
	}
	public static int[][] mpow(int[][] a
, int n
){
		int N 
= a
.length
;
		int[][] ans 
= new int[N
][N
];
		for(int i 
= 0; i 
< N
; i
++) {
			ans
[i
][i
] = 1;
		}
		while(n 
> 0) {
			if((n 
& 1) == 1) {
				ans 
= mul(ans
, a
);
			}
			a 
= mul(a
, a
);
			n 
>>= 1;
		}
		return ans
;
	}
}
 
🍂欧拉函数
 
小于n的正整数中与n互质的数的数目(φ(1)=1)
 
public class Text {
	public static void main(String
[] args
) {
		
	}
	
	public static int euler(int n
) {
		int ans 
= n
;
		
		for(int i 
= 2; i 
<= n
; i
++) {
			if(n 
% i 
== 0) {
				ans  
= ans 
/ i 
* (i 
- 1);
				while(n 
% i 
== 0) {
					n 
/= i
;
				}
			}
		}
		return ans
;
	}
	public static int euler2(int n
) {
		int ans 
= n
;
		
		for(int i 
= 2; i 
* i 
<= n
; i
++) {
			if(n 
% i 
== 0) {
				ans  
= ans 
/ i 
* (i 
- 1);
				
				while(n 
% i 
== 0) {
					n 
/= i
;
				}
			}
		}
		if(n 
> 1) { 
			ans 
= ans 
/ n 
* (n 
- 1);
		}
		return ans
;
	}
}
 
🍂前缀和模板
 
import java
.util
.Scanner
;
public class Text {
	public static void main(String
[] args
) {
		Scanner input 
= new Scanner(System
.in
);
		int n 
= input
.nextInt();
		int[] sum 
= new int[n 
+ 1];
		for(int i 
= 1; i 
<= n
; i
++) {
			sum
[i
] = sum
[i 
- 1] + input
.nextInt();
		}
		input
.close();
	}
	
}
 
🍂求组合数C(n, m)
 
其实求解组合数有很多方法
 
例如
 
C(n
, m
) = n
! / m
!(n 
- m
)!
    
C(n
, m
) = A(n
, m
) / A(m
, m
)
C(n
, m
) = C(n
, n 
- m
)
 
import java
.util
.Scanner
;
public class Text {
	public static void main(String
[] args
) {
		Scanner in 
= new Scanner(System
.in
);
		n 
= in
.nextInt();
		f 
= new long[n 
+ 5];
		inv 
= new long[n 
+ 5];
		f
[0] = 1;
		for (int i 
= 1; i 
< n 
+ 5; i
++) {
			f
[i
] = f
[i 
- 1] * i 
% mod
;
			inv
[i
] = mpow(f
[i
], mod 
- 2);
		}
		in
.close();
	}
	static int n
;
	static long mod 
= 1000000009;
	static long[] f
;
	static long[] inv
;
	static long C(int n
, int m
) {
		return f
[n
] * inv
[m
] % mod 
* inv
[n 
- m
] % mod
;
	}
	static long mpow(long a
, long n
) {
		if (n 
== 0 || a 
== 1)
			return 1;
		long ans 
= 1;
		while (n 
!= 0) {
			if (n 
% 2 == 1)
				ans 
= a 
* ans 
% mod
;
			a 
= a 
* a 
% mod
;
			n 
>>= 1;
		}
		return ans
;
	}
}
 
🍂乘法逆元(费小马定理)
 
public static long qmi(long a
, long b
, long p
){ 
    long res 
= 1;
    while(b 
!= 0){
        if((b
&1) == 1){
            res 
= res 
* a 
% p
; 
        }
        b 
>>= 1;
       a 
= a 
* a 
% p
;
    }
    return res
;
}
 public static void Init(){
     infact
[0] = 1; 
     fact
[0] = 1;
     for(int i 
= 1; i 
<= 100000; i
++){
         fact
[i
] = fact
[i
-1] * i 
% mod
; 
         infact
[i
] = infact
[i
-1] * qmi(i
, mod 
- 2, mod
) % mod
;
    }
}
 
🍂大数加法
 
public class Main{
    static BufferedReader in 
= new BufferedReader(new InputStreamReader(System
.in
));
    static BufferedWriter out 
= new BufferedWriter(new OutputStreamWriter(System
.out
));
    
    public static void main(String
[] agrs
) throws IOException
{
        String s 
= in
.readLine();
        String s1 
= in
.readLine();
        int lena 
= s
.length();
        int lenb 
= s1
.length();
        
        ArrayList
<Integer> a 
= new ArrayList<>();
        ArrayList
<Integer> b 
= new ArrayList<>();
        
        for(int i 
= lena 
- 1;  i 
>= 0; i
--) a
.add(s
.charAt(i
) - '0'); 
        for(int i 
= lenb 
- 1; i 
>= 0; i
--) b
.add(s1
.charAt(i
) - '0');
        
        ArrayList
<Integer> c 
= new ArrayList<>();
        
        
        int r 
= 0;
        for(int i 
= 0; i 
< lena 
|| i 
< lenb
; i
++){
            if(i 
< lena
) r 
+= a
.get(i
);
            if(i 
< lenb
) r 
+= b
.get(i
);
            c
.add(r
%10);
            r 
/= 10;
        }
        
        if(r 
!= 0) c
.add(r
);
        for(int i 
= c
.size()-1; i 
>= 0; i
--) out
.write(c
.get(i
) + ""); 
        out
.flush();
    }
}
 
🍂大数乘法
 
public class Main{
    static BufferedReader in 
= new BufferedReader(new InputStreamReader(System
.in
));
    static BufferedWriter out 
= new BufferedWriter(new OutputStreamWriter(System
.out
));
    static int[] a 
= new int[1000], b 
= new int[1000], c 
= new int[1000];
    public static void main(String
[] args
) throws IOException
{
        
        String s 
= in
.readLine();
        String s1 
= in
.readLine();  
        
        int lena 
= s
.length();
        int lenb 
= s1
.length();
        
        for(int i 
= lena 
- 1, j 
= 0; i 
>= 0; i
--, j
++)  a
[j
] = s
.charAt(i
) - '0';
        for(int i 
= lenb 
- 1, j 
= 0; i 
>= 0; i
--, j
++)  b
[j
] = s1
.charAt(i
) - '0';
        
        for(int i 
= 0; i 
< lena
; i
++)
            for(int j 
= 0; j 
< lenb
; j
++){
                c
[i
+j
] += a
[i
] * b
[j
]; 
                c
[i
+j
+1] += c
[i
+j
]/10; 
                c
[i
+j
] %= 10; 
            }
        
        
        int lenc 
= lena 
+ lenb 
- 1; 
        while(c
[lenc
] == 0 && lenc 
> 0) lenc 
--; 
        
        for(int i 
= lenc
; i 
>= 0; i
--){
            out
.write(c
[i
] + "");
        }
        
        out
.flush();
    }
}
                
                
                
        
    
转载请注明原文地址:https://blackberry.8miu.com/read-35190.html