既约分数、阶乘约数、逆元、最大质因子个数【算法赛】

既约分数

既约分数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如果一个分数的分子和分母的最大公约数是 11,这个分数称为既约分数。

例如 3/4,1/8,7/1,4/3​,8/1​,1/7​, 都是既约分数。

请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和 2020)?

复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




public class Main {

    static int N = 110,mod=(int)1e9+7;

   
    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 res=0;
        for (int i = 1; i <= 2020; i++) {
			for (int j = 1; j<= 2020; j++) {
				//if(i==j)continue;
				if(gcd(i,j)==1)res++;
			}
		}
        System.out.println(res);
        
    }
    static int gcd(int a,int b){
    	if(b==0)return a;
    	return gcd(b,a%b);
    }
}

阶乘约数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

定义阶乘 n!=1×2×3×⋅⋅⋅×n

请问 100!(100 的阶乘)有多少个正约数。

复制代码
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];
//    //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]);
          for (int i = 2; i <= 100; i++) {
			update(i);
		  }
          long res=1;
          for (int i = 2; i <= 100; i++) {
			 res*=a[i]+1;
		  }
          System.out.println(res);
    }
    static void update(int n){
    	for (int i = 2; i*i <=n; i++) {
			if(n%i==0){
				while(n%i==0){
					a[i]++;
					n/=i;
				}
			}
		}
    	if(n>1)a[n]++;
    }
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




public class Main {

    static int N = 110,mod=(int)1e9+7,ind;
    static int prime[]=new int[N];
    static int a[]=new int[N];
    static boolean f[]=new boolean[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]);
          get_Prime(100);//相当于求出了100!之内的所有素数
        long ans=1;
        // 10! 里所有 2 的因子全部写出来
//        用公式 ⌊10/2⌋ + ⌊10/4⌋ + ⌊10/8⌋ 怎么得到 8 的?
//        ⌊10/2⌋ = 5
//        代表"从 2,4,6,8,10 这五个数中各取 第一个 2"。
//        我们得到的标记:2a(来自2),2b(来自4),2d(来自6),2e(来自8),2h(来自10)。
//        现在收集到 5 个 2。
//
//        ⌊10/4⌋ = 2
//        代表"从 4 和 8 这两个数中再各取 下一个 2"。
//        4 还有第二个 2 → 2c
//        8 还有第二个 2 → 2f
//        现在又收集到 2 个,累计 7 个。
//
//        ⌊10/8⌋ = 1
//        代表"从 8 这个数中再取 下一个 2"。
//        8 还有第三个 2 
        
        for (int i = 0; i < ind; i++) {
			int su=1,res=0;
			while(su*prime[i]<=100){
				su=su*prime[i];
				res+=100/su;
			}
			ans=ans*(res+1);
		}
        System.out.println(ans);
    }
    static void get_Prime(int n){
    	for (int i = 2; i<=n; i++) {
			if(!f[i])prime[ind++]=i;
			for (int j = 0; j < ind && i*prime[j]<=n; j++) {
				f[i*prime[j]]=true;
				if(i%prime[j]==0)break;
			}
			
		}
    }
}

逆元

问题描述

数论中的逆元是一个可以把除法转换为乘法的工具。若自然数 a,Iaa,Ia​ 满足 a×Ia≡1(mod M)a×Ia​≡1(mod M),则称 aa 在模 MM 的意义下的逆元为 IaIa​,这样在模 MM 下计算除法时,可以把除以 aa 的运算转化为乘以其逆元 IaIa​。

给定质数模数 M=2146516019M=2146516019,根据费马小定理对于不是 MM 倍数的正整数 aa,有 a(M−1)≡1(mod M)a(M−1)≡1(mod M),求出 1,2333333331,233333333 内所有自然数的逆元。则所有逆元的异或和为多少?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




public class Main {

    static int N = 110,mod=2146516019,ind;

   
    public static void main(String[] args) throws IOException {
    	
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      //ax=1(mod)  由费马小定理 a^(p-1)=1(mod)    ax=a^(p-1)  x=a^(p-2)
       boolean first=true;
       int res=0;
       for (int i = 1; i <= 233333333; i++) {
		   long ni=calcReverse(i,mod-2,mod);
		   if(first){
			   res=(int)ni;
			   first=false;
		   }
		   else  res=(int)((res^ni));
	   } 
       
       System.out.println(res);
    }
    static long calcReverse(long a,int p,int m){
    	long res=1;
    	while(p>0){
    		if((p&1)==1){
    			res=res*a%mod;
    		}
    		a=a*a%mod;
    		p=p>>1;
    	}
    	return res;
    }
}

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        System.out.println(1307261675);
        scan.close();
    }
}

最大质因子个数【算法赛】

问题描述

给定一个正整数 NN,请你在 22 到 NN 之间找到拥有不同质因子个数最多的整数,并求出该整数的不同质因子的个数。

输入格式

第一行包含一个整数 TT(1≤T≤1031≤T≤103),表示测试用例的数量。

接下来 TT 行,每行包含一个正整数 NN(2≤N≤10182≤N≤1018),表示要求解的范围。

输出格式

对于每个测试用例,输出一个整数,表示在 22 到 NN 之间拥有最多不同质因子的整数的质因子个数。

样例输入

复制代码
1
7

样例输出

复制代码
2

样例说明

在 2∼72∼7 中:

  • 22 的质因子有: 22

  • 33 的质因子有: 33

  • 44 的质因子有:22

  • 55 的质因子有:55

  • 66 的质因子有:2,32,3

  • 77 的质因子有:77

因此,66 是 2∼72∼7 中不同质因子个数最多的整数,其拥有的不同质因子个数为

复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;




public class Main {

    static int N = 10010,mod=2146516019,ind;
    static int prime[]=new int[N];
    static int a[]=new int[N];
    static boolean f[]=new boolean[N];
   
    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 n=Integer.parseInt(g[0]);
        get_Prime(53);
       
        for (int i = 0; i < t; i++) {
			long  n=Long.parseLong(br.readLine());
			
			for (int j = 0; j < ind; j++) {
				n/=prime[j];
				if(n==0){
					System.out.println(j);
					break;
				}
			}
		}
    }
    static void get_Prime(int n){
    	for (int i = 2; i <= n; i++) {
			if(!f[i])prime[ind++]=i;
			for (int j = 0; j < ind && i*prime[j]<=n; j++) {
			  	f[i*prime[j]]=true;
			  	if(i%prime[j]==0)break;
			}
		}
    }
}
相关推荐
KaMeidebaby2 小时前
卡梅德生物技术快报|Western Blot 实验应用:肺肠轴机制研究全流程技术解析
前端·数据库·人工智能·算法·百度
AhriProGramming2 小时前
计算机科普故事会-<2>见微知著
算法
BD4SXV2 小时前
线性二次调节器(Linear Quadratic Regulator,LQR)的无限时域最优控制求解与黎卡提方程
算法·自动化
ST——Jess2 小时前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构
Matrix_113 小时前
第13篇:非线性位移场——漩涡、鱼眼、水波纹与球面化
图像处理·算法
金牌归来发现妻女流落街头3 小时前
【LeetCode 第207题】
算法·leetcode·拓扑·领接表
熬夜敲代码的猫3 小时前
AVL树(C++详解版)
数据结构·c++·算法
-To be number.wan3 小时前
算法日记 | STL-MAP
c++·算法
cjp5603 小时前
015. UG 二次开发,拉伸草图生成实体类,高级草图类封装
算法