HDU 1562猜数字题如何巧妙利用长尾词提高猜测准确性?
- 内容介绍
- 文章标签
- 相关推荐
本文共计838个文字,预计阅读时间需要4分钟。
题目要求猜测一个在1000到9999之间的最小数字x,使得以下条件成立:
1.\( (1) \ x \% a=0 \)
2.\( (2) \ (x + 1) \% b=0 \)
3.\( (3) \ (x + 2) \% c=0 \)
其中,a、b、c是介于1到100之间的整数。已知a、b、c的值,需要找出满足条件的最小x。解题步骤如下:
1. 理解条件:需要找到一个x,它自身、比它大1和比它大2的数都能被a、b、c整除。
2. 寻找规律:由于x、x+1、x+2都需要被a、b、c整除,可以推断出x应该是a、b、c的最小公倍数的倍数。
3. 计算最小公倍数:首先计算a、b、c的最小公倍数(LCM)。由于a、b、c都在1到100之间,可以直接使用辗转相除法或者编程计算。
4. 找到最小的x:找到大于等于1000的最小的LCM的倍数。
假设a、b、c的值分别是3、5、7,下面是计算过程:
- 计算3、5、7的最小公倍数: - 3和5的最小公倍数是15(因为3*5=15,没有共同的因子)。 - 15和7的最小公倍数是105(因为15*7=105,没有共同的因子)。
- 找到大于等于1000的最小的105的倍数: - 1000除以105得到9余55,所以1000不是105的倍数。 - 105的下一个倍数是1050(9*105=945,加上105得到1050),但是1050小于1000。 - 继续增加105,下一个倍数是1115(10*105=1050,加上105得到1115),这是大于1000的最小的105的倍数。
所以,对于a=3、b=5、c=7的情况,满足条件的最小x是1115。
输出结果:Minimum number x is 1115
Description
Happy new year to everybody!
Now, I want you to guess a minimum number x betwwn 1000 and 9999 to let
(1) x % a = 0;
(2) (x+1) % b = 0;
(3) (x+2) % c = 0;
and a, b, c are integers between 1 and 100.
Given a,b,c, tell me what is the number of x ?
Input
The number of test cases c is in the first line of input, then c test cases followed.every test contains three integers a, b, c.
Output
For each test case your program should output one line with the minimal number x, you should remember that x is between 1000 and 9999. If there is no answer for x, output "Impossible".
Sample Input
2 44 38 49 25 56 3
Sample Output
Impossible
2575
大水题,什么都不用管,直接循环跑一遍就好了
#include<set>
#include<map>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define per(i,j,k) for (int i = j; i >= k; i--)
using namespace std;
typedef long long LL;
const int low(int x) { return x&-x; }
const double eps = 1e-8;
const int INF = 0x7FFFFFFF;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
int T, n, m, a, b, c;
bool solve()
{
rep(x, 1000, 9999)
{
if (x%a == 0 && (x + 1) % b == 0 && (x + 2) % c == 0)
{
printf("%d\n", x);
return true;
}
}
return false;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &a, &b, &c);
if (!solve()) printf("Impossible\n");
}
return 0;
}
本文共计838个文字,预计阅读时间需要4分钟。
题目要求猜测一个在1000到9999之间的最小数字x,使得以下条件成立:
1.\( (1) \ x \% a=0 \)
2.\( (2) \ (x + 1) \% b=0 \)
3.\( (3) \ (x + 2) \% c=0 \)
其中,a、b、c是介于1到100之间的整数。已知a、b、c的值,需要找出满足条件的最小x。解题步骤如下:
1. 理解条件:需要找到一个x,它自身、比它大1和比它大2的数都能被a、b、c整除。
2. 寻找规律:由于x、x+1、x+2都需要被a、b、c整除,可以推断出x应该是a、b、c的最小公倍数的倍数。
3. 计算最小公倍数:首先计算a、b、c的最小公倍数(LCM)。由于a、b、c都在1到100之间,可以直接使用辗转相除法或者编程计算。
4. 找到最小的x:找到大于等于1000的最小的LCM的倍数。
假设a、b、c的值分别是3、5、7,下面是计算过程:
- 计算3、5、7的最小公倍数: - 3和5的最小公倍数是15(因为3*5=15,没有共同的因子)。 - 15和7的最小公倍数是105(因为15*7=105,没有共同的因子)。
- 找到大于等于1000的最小的105的倍数: - 1000除以105得到9余55,所以1000不是105的倍数。 - 105的下一个倍数是1050(9*105=945,加上105得到1050),但是1050小于1000。 - 继续增加105,下一个倍数是1115(10*105=1050,加上105得到1115),这是大于1000的最小的105的倍数。
所以,对于a=3、b=5、c=7的情况,满足条件的最小x是1115。
输出结果:Minimum number x is 1115
Description
Happy new year to everybody!
Now, I want you to guess a minimum number x betwwn 1000 and 9999 to let
(1) x % a = 0;
(2) (x+1) % b = 0;
(3) (x+2) % c = 0;
and a, b, c are integers between 1 and 100.
Given a,b,c, tell me what is the number of x ?
Input
The number of test cases c is in the first line of input, then c test cases followed.every test contains three integers a, b, c.
Output
For each test case your program should output one line with the minimal number x, you should remember that x is between 1000 and 9999. If there is no answer for x, output "Impossible".
Sample Input
2 44 38 49 25 56 3
Sample Output
Impossible
2575
大水题,什么都不用管,直接循环跑一遍就好了
#include<set>
#include<map>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define per(i,j,k) for (int i = j; i >= k; i--)
using namespace std;
typedef long long LL;
const int low(int x) { return x&-x; }
const double eps = 1e-8;
const int INF = 0x7FFFFFFF;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
int T, n, m, a, b, c;
bool solve()
{
rep(x, 1000, 9999)
{
if (x%a == 0 && (x + 1) % b == 0 && (x + 2) % c == 0)
{
printf("%d\n", x);
return true;
}
}
return false;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &a, &b, &c);
if (!solve()) printf("Impossible\n");
}
return 0;
}

