本文最后更新于: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.*;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(); } }