第十二届省赛 c++ B组填空题
//256MB = 256 * 1024 * 1024字节, 而一个字节等于8bit, 所以32位等于4字节, 最后除以四即可.
public static void main(String[] args) {
int t = 256 * 1024 * 1024;
System.out.println(t / 4);
}
for(int i = 1; i <= 100000; i++){
int k = i;
while(k > 0){
int g = k % 10;
a[g]++;
if(a[g] > 2021){
System.out.println(i);
return;
}
k /= 10;
}
}
import java.util.*;
public class Main{
/*
①利用直线方程 y = kx + b,但是不是直接利用,由于考虑到精度,
k = (y2-y1) / (x2-x1);
b = (y1*x2 - x1*y2)。
(此时这里就有两个大坑——
1、分子分母需要 * 1.0否则循环出来都是整数;
2、分母/分子会出现除不尽的情况,这时候我们需要把分母和分子最简化,比如 9/12 -> 3/4,涉及最大公约数,这是最后优化精度的一个关键点)。
②用HashSet集合存储直线。
③然后直接遍历,4个for循环解决。
*/
public static void main(String[] args) {
//利用 y = kx + b;
//斜率不存在的直线数 即 x的点数 20(0-19)
//用set存储
double k = 0; //斜率
double b = 0; //截距
HashSet<String> set = new HashSet<>();
for (int x1 = 0; x1 < 20; x1++) {
for (int y1 = 0; y1 < 21; y1++) {
for (int x2 = 0; x2 < 20; x2++) {
for (int y2 = 0; y2 < 21; y2++) {
//斜率存在
if (x1 != x2) {
//这里是有个坑的,x1 x2 y1 y2都是整数,需要 *1.0变成双精度
int muk = (x2 - x1);
int zik = (y2 - y1);
int tk = gcd(muk, zik);
k = (zik/tk) * 1.0 / (muk/tk);
//b = y1 - k * x1; //精度太差,但是往往考试时很容易就这么写
//把 k = (y2 - y1) / (x2 - x1) 化简就为 b = (x2*y1 - x1*y2)/(x2 - x1)
int mub = (x2 - x1);
int zib = (y1*x2 - x1*y2);
int tb = gcd(mub, zib);
b = (zib/tb) * 1.0 / (mub/tb);
String line = k +"," +b;
set.add(line);
}
}
}
}
}
System.out.println(set.size() + 20); //40257 -- 就是答案
}
//最大公约数
static int gcd(int a, int b) {
return b != 0 ? gcd(b, a%b) : a ;
}
}
import java.util.*;
public class Main {
//先求n的所有因数(即约数),然后三重for循环,枚举每一种三个约数组合,若三个约数相乘等于n,就方案数加一
public static void main(String[] args) {
ArrayList<Long> v = new ArrayList<>();
long n = 2021041820210418l;
// 计算 n 的所有约数
for (long i = 1; i < n / i; i++) {
if (n % i == 0) {
v.add(i);
if (n / i != i) {
v.add(n / i);
}
}
}
// 三重循环,枚举每一种三个约数组合,使三个约数相乘等于 n
int res = 0; // 方案数
for (int i = 0; i < v.size(); i++) {
for (int j = 0; j < v.size(); j++) {
for (int k = 0; k < v.size(); k++) {
if (v.get(i) * v.get(j) * v.get(k) == n) {
res++;
}
}
}
}
System.out.println(res);
}
}
import java.util.*;
public class Main{
static int N = 2022,n = 2021,max = 0x3f3f3f3f;
static int[][] g = new int[N][N];//存每个点之间的距离
static int[] dist = new int[N];//存每个点到起点之间的距离
static boolean[] st = new boolean[N];//存已经确定了最短距离的点
public static int dijkstra(){
Arrays.fill(dist,max);//将dist数组一开始赋值成较大的数
dist[1] = 0; //首先第一个点是零
//从0开始,遍历n次,一次可以确定一个最小值
for(int i = 0 ; i < n ; i ++ ){
int t = -1; //t这个变量,准备来说就是转折用的
for(int j = 1 ; j <= n ; j ++ ){
/***
* 因为数字是大于1的,所以从1开始遍历寻找每个数
* 如果s集合中没有这个数
* 并且t == -1,表示刚开始 或者 后面的数比我新找的数距离起点的距离短
* 然后将j 的值赋值给 t
***/
if(!st[j] && (t == -1 || dist[j] < dist[t])){
t = j;
}
}
st[t] = true;//表示这个数是已经找到了确定了最短距离的点
//用已经确认的最短距离的点来更新后面的点
//就是用1到t的距离加上t到j的距离来更新从1到j的长度
for(int j = 1 ; j <= n ; j ++ ){
//
dist[j] = Math.min(dist[j],dist[t] + g[t][j]);
}
}
//如果最后n的长度没有改变,输出-1,没有找到;否则输出最短路n
if(dist[n] == max) return -1;
else return dist[n];
}
static int gcd(int a ,int b){
return b !=0 ? gcd(b,a%b) : a;
}
public static void main(String[] args){
//将他们每个点一开始赋值成一个较大的值
for(int i = 1 ; i <= n ; i ++ ){
Arrays.fill(g[i],max);
}
for(int i = 1 ; i <= n ; i ++){
for(int j = i + 1 ; j <= n ; j ++){
int c;
//说明是无向边 直接跳过
if(Math.abs(i - j) > 21){
continue;
}else{
c = (i * j) /gcd(i,j);
//System.out.println(c);
}
g[i][j] = Math.min(g[i][j],c);//这个因为可能存在重边,所以泽出最短的
}
}
int res = dijkstra();
System.out.println(res);
}
}
第十二届省赛 c++ C组填空题
System.out.println('L' - 'A' + 'A');
for(int i = 1; i <= 1000000007; i++){
if((long)i * 2021 % 1000000007 == 999999999){
System.out.println(i);
}
}