既约分数
既约分数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如果一个分数的分子和分母的最大公约数是 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;
}
}
}
}