文章目录
HENAU 冬令营 数学专题
知识汇总
题目列表
快输模板
import java.io.*;
import java.util.*;
public class Main {
static class FastReader{
BufferedReader br;
StringTokenizer st;
public FastReader(){br=new BufferedReader(new InputStreamReader(System.in));}
String next(){
while (st==null||!st.hasMoreElements()) {
try {st = new StringTokenizer(br.readLine());}
catch (IOException e) {e.printStackTrace();}}
return st.nextToken();}
int nextInt(){return Integer.parseInt(next());}
long nextLong(){return Long.parseLong(next());}
boolean hasNext(){
if (st!=null && st.hasMoreTokens())
return true;
try {
st=new StringTokenizer(br.readLine());
} catch (Exception e) {
return false;
}
return true;
}
}
static PrintWriter out=new PrintWriter(
new BufferedWriter(new OutputStreamWriter(System.out)));
}
A - A^B Mod C
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int c=sc.nextInt();
System.out.println(pow(a,b,c));
}
public static long pow(long a,long b,long p){
long res=1;
while(b!=0){
if((b&1)==1)res=res*a%p;
a=a*a%p;
b=b>>1;
}
return res;
}
B - 逆元
public static void main(String[] args) {
FastReader sc=new FastReader();
long p=sc.nextLong();
if(!isprime(p)) System.out.println("AKCniubi");
else {
if(p==2)
System.out.println(1);
else
System.out.println((p-1)/2*p);
}
}
public static boolean isprime(long x){
for(long i=2;i*i<=x;i++)
if(x%i==0)
return false;
return true;
}
C - 判决素数个数
方法一:埃氏筛法
static boolean isprime[]=new boolean[100005];
static int prime[]=new int[100000];
public static void main(String[] args) {
FastReader sc=new FastReader();
int x=sc.nextInt();
int y=sc.nextInt();
int cnt=0;
if(x>y){
int t=x;
x=y;
y=t;
}
isprime[1]=true;
for(int i=2;i<=y;i++){
if(!isprime[i]){
prime[cnt++]=i;
for(int j=i*2;j<=y;j+=i){
isprime[j]=true;
}
}
}
int sum=0;
for(int i=0;i<cnt;i++){
if(prime[i]>=x)sum++;
}
out.println(sum);out.flush();
}
方法二:区间筛法
static boolean is_prime[]=new boolean[100005];
static boolean is_prime_small[]=new boolean[100005];
public static void main(String[] args) {
FastReader sc=new FastReader();
int x=sc.nextInt();
int y=sc.nextInt();
if(x>y){
int t=x;x=y;y=t;
}
int sum=0;
segment_sieve(x,y+1);
for(int i=0;i<y+1-x;i++){
if(is_prime[i])sum++;
}
if(x==1)sum--;
out.println(sum);out.flush();
}
static void segment_sieve(int a,int b)
{
for(int i=0;i*i<b;++i) is_prime_small[i]=true;
for(int i=0;i<b-a;++i) is_prime[i]=true;
for(int i=2;i*i<b;++i) {
if(is_prime_small[i]) {
for(int j=2*i;j*j<b;j+=i) is_prime_small[j]=false;
for(int j=Math.max(2,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;
}
}
}
D - 矩阵乘法
public static void main(String[] args) {
FastReader sc=new FastReader();
int n=sc.nextInt();
int m=sc.nextInt();
int k=sc.nextInt();
long a[][]=new long[n][m];
long b[][]=new long[m][k];
long sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
a[i][j]=sc.nextInt();
}
for(int i=0;i<m;i++){
for(int j=0;j<k;j++)
b[i][j]=sc.nextInt();
}
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
sum=0;
for(int o=0;o<m;o++)
sum+=a[i][o]*b[o][j];
out.print(sum+" ");
}
out.println();
}
out.flush();
}
E - Bash游戏
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long t=sc.nextLong();
long n,k;
while(t-->0){
n=sc.nextLong();
k=sc.nextLong();
k++;
if(n%k!=0)System.out.println("A");
else System.out.println("B");
}
}
F - 取石子游戏
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a,b;
while(sc.hasNext()){
a=sc.nextInt();
b=sc.nextInt();
if(a>b){
int tmp=a;a=b;b=tmp;
}
if(a==(int)((b-a)*(1+Math.sqrt(5.0))/2))
System.out.println(0);
else System.out.println(1);
}
}
G - Matches Game
使用快输,在vjudge上会RE;POJ上能AC
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t;
while(sc.hasNext()){
t=sc.nextInt();
int s=sc.nextInt();
for(int i=1;i<t;i++){
s^=sc.nextInt();
}
if(s==0)System.out.println("No");
else System.out.println("Yes");
}
}
H - 互质数的个数(一)
public static void main(String[] args) {
FastReader sc=new FastReader();
int t=sc.nextInt();
long n;
while(t-->0){
n=sc.nextLong();
out.println(euler_deal(n));
out.flush();
}
}
public static long euler_deal(long n){
long res=n;
for(long i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
for(;n%i==0;n/=i);
}
}
if(n!=1) res=res/n*(n-1);
return res;
}
I - Sumdiv
知识点
static int mod=9901;
static int maxn=10010;
static int tot;
static long p[],q[];
public static void main(String[] args) {
FastReader sc=new FastReader();
long n=sc.nextLong();
long m=sc.nextLong();
long ans=1;
if(n==0) out.println(0);
else if(n==1||m==0) out.println(1);
else {
p = new long[maxn];
q = new long[maxn];
factor(n);
for (int i=1;i<=tot;i++) q[i]*=m;
for (int i=1;i<=tot;++i) {
ans *= getsum(p[i],q[i]);
ans %= mod;
}
out.println(ans);
}
out.flush();
}
public static long pow(long a,long b){
long ans=1;
while(b!=0) {
if((b&1)==1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
public static long getsum(long a, long b) {
if(b==0) return 1;
if((b&1)==1) return getsum(a,b/2)*(1+pow(a,b/2+1))%mod;
else return (getsum(a,b/2-1)*(1+pow(a,b/2+1))+pow(a,b/2))%mod;
}
static void factor(long n) {
tot=0;
long now=n;
for (int i=2;i*i<=n;++i) {
if (now%i==0) {
p[++tot] = i;
q[tot] = 0;
while (now % i == 0) {
++q[tot];
now /= i;
}
}
}
if (now!=1) {
p[++tot] = now;
q[tot] = 1;
}
}
J - The Lottery
知识点
static int a[],m;
static long n,ans;
public static void main(String[] args) {
FastReader sc=new FastReader();
while(sc.hasNext()){
n=sc.nextLong();
m=sc.nextInt();
a=new int[m];
for(int i=0;i<m;i++)a[i]=sc.nextInt();
ans=n;
for(int i=0;i<m;i++) {
ans=ans-n/a[i];
dfs(a[i],i+1,2);
}
out.println(ans);out.flush();
}
}
public static long gcd(long a,long b) {return (b!=0)?gcd(b,a%b):a;}
public static long lcm(long a,long b) {return a/gcd(a,b)*b;}
public static void dfs(long hav,int cur,long num)
{
if(hav>n||cur>=m) return;
for(int i=cur;i<m;i++)
{
long temp=lcm(hav,a[i]);
if((num&1)==1)
ans=ans-n/temp;
else
ans=ans+n/temp;
dfs(temp,i+1,num+1);
}
}
K - 组合数问题
知识点
static int t,k,n,m;
static int c[][]=new int[2005][2005];
static int s[][]=new int[2005][2005];
public static void main(String[] args) {
FastReader sc=new FastReader();
for(int i=0;i<2005;i++){
Arrays.fill(c[i],0);
Arrays.fill(s[i],0 );
}
t=sc.nextInt();
k=sc.nextInt();
prepare();
while(t-->0){
n=sc.nextInt();
m=sc.nextInt();
if(m>n) m=n;
out.println(s[n][m]);out.flush();
}
}
public static void prepare(){
c[1][1]=1;
for(int i=0;i<=2000;i++) c[i][0]=1;
for(int i=2;i<=2000;i++){
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
}
}
for(int i=2;i<=2000;i++){
for(int j=1;j<=i;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
if(c[i][j]==0) s[i][j]+=1;
}
s[i][i+1]=s[i][i];
}
}
L - 同余方程
知识点
static long x,y;
public static void main(String[] args) {
FastReader sc = new FastReader();
long a=sc.nextLong();
long b=sc.nextLong();
exgcd(a,b);
x=(x%b+b)%b;
out.println(x);out.flush();
}
public static void exgcd(long a,long b) {
if(b==0) {
x = 1;
y = 7;
return;
}
exgcd(b,a % b);
long nx=x;
x=y;
y = nx-a/b*y;
}