P7772 [COCI 2009-2010 #2] FAKTOR 题解

思路:

题目要求得到最小的 N N N,而根据 ⌈ N A ⌉ ≥ I \lceil \frac{N}{A}\rceil\geq I ANI 易得: N N N 应该 ≤ I × A \leq I\times A I×A N > A × I N\gt A\times I N>A×I 是可以取到的,不过此处是求 N N N 的最小值,所以 N N N 要尽可能小,最理想的是 A < a × i A<a\times i A<a×i。而当 A = 1 A=1 A=1 时,此处取等,故 N N N 应该 ≤ I × A \leq I\times A I×A)。所以我们只需要从 I × A I\times A I×A 向下枚举即可。

时间复杂度

说了这么多,真的有用吗?从 I × A I\times A I×A 向下枚举,不会 T T T 吗?

不会!

主要原因有两个:

  1. N = ( I − 1 ) × A N=(I-1)\times A N=(I1)×A 时, N A = I − 1 \frac{N}{A}=I-1 AN=I1,你再怎么向上取证也没用。而 I I I 的数据范围是 1 ≤ I ≤ 100 1\leq I\leq 100 1I100
  2. 即使都循环一遍, I , A I,A I,A 的范围只有 1 ≤ A , I ≤ 100 1\leq A,I \leq 100 1A,I100 I × A I\times A I×A 最大也就 10000 10000 10000 怎么会超时?

code

#include<bits/stdc++.h>
using namespace std;
int n,a,i; 
int main(){
	cin>>a>>i;
	n=a*i;
    while(n!=a*(i-1)&&ceil(n*1.00/a)>=i){//从I*A循环到低,如果N=(I-1)*A,那么就不能满足条件,结束;如果n/a向上取整<i,不符题意,退出。
    	n--;
	}
	cout<<n+1;//得出来的n是不符题意的,而n+1是符合的
	return 0;
}

可是,这还没有结束

刚刚我们说到了:

N = ( I − 1 ) × A N=(I-1)\times A N=(I1)×A 时, N A = I − 1 \frac{N}{A}=I-1 AN=I1,你再怎么向上取证也没用。

那么, N = ( I − 1 ) × A + 1 N=(I-1)\times A+1 N=(I1)×A+1 时, N A > I − 1 \frac{N}{A}>I-1 AN>I1 吗?答案是肯定的。

所以,我们只需要输出 ( I − 1 ) × A + 1 (I-1)\times A+1 (I1)×A+1 即可。

code

#include<bits/stdc++.h>
using namespace std;
int a,i; 
int main(){
	cin>>a>>i;
	cout<<a*(i-1)+1;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值