刷题笔记-(CF1085B)-Div Times Mod

本文最后更新于:March 31, 2022 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

题目链接

思路

由题目给出的条件: (𝑥 div 𝑘)⋅(𝑥 mod 𝑘) = 𝑛 。可以知道 (𝑥 mod 𝑘) 是 n 的一个因数。即 n % (𝑥 mod 𝑘) = 0。而题目给出的数据范围 n 是大于 1 的,所以要让 n % (𝑥 mod 𝑘) = 0 成立,必须是 (𝑥 mod 𝑘) 不等于0。而 k 又是大于 2 的,所以 x 就不能等于 k(相等时 x mod k 就等于0了)。

把 (𝑥 mod 𝑘) 看作是 i ,所以 n % i==0。而 i 的范围是1~k-1(因为 i = x mod k)。

又因为 i = x mod k ,所以 x div k 就可以替换为 (x-i) / k (例如2=5%3,则5/3==(5-2) / 3)。

所以,原题目给出的公式就替换为:(x-i) / k \* i = n;所以,x = n / i * k + i ;(1 ≤ i ≤ k-1)

所以,用一个循环遍历 i 即可。 而条件就是 n % i==0

因为题目又要求输出最小值,所以从大到小遍历 1 ~ k-1即可(除大的剩余的少)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.io.*;
import java.util.*;

/**
* @Author DragonOne
* @Date 2021/12/5 21:27
* @墨水记忆 www.tothefor.com
*/

public class Main {
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
public static Scanner sc = new Scanner(System.in);

public static void main(String[] args) throws Exception {

int n = nextInt();
int k = nextInt();
for(int i=k-1;i>0;--i){
if(n%i==0){
System.out.println(n/i*k+i);
break;
}
}

closeAll();
}

public static int nextInt() throws Exception {
cin.nextToken();
return (int) cin.nval;
}

public static long nextLong() throws Exception {
cin.nextToken();
return (long) cin.nval;
}

public static double nextDouble() throws Exception {
cin.nextToken();
return cin.nval;
}

public static String nextString() throws Exception {
cin.nextToken();
return cin.sval;
}

public static void closeAll() throws Exception {
cout.close();
in.close();
out.close();
}
}