P1618 三连击(升级版)
题目描述
将 1,2,…,91, 2,\ldots, 91,2,…,9 共 999 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:CA:B:CA:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
//感谢黄小U饮品完善题意
输入格式
三个数,A,B,CA,B,CA,B,C。
输出格式
若干行,每行 333 个数字。按照每行第一个数字升序排列。
输入输出样例 #1
输入 #1
1 2 3
输出 #1
192 384 576
219 438 657
273 546 819
327 654 981
说明/提示
保证 0≤A<B<C≤9990 \le A<B<C \le 9990≤A<B<C≤999。
upd 2022.8.3\text{upd 2022.8.3}upd 2022.8.3:新增加二组 Hack 数据。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int b[10];
void go(int x)
{
b[x%10]=1;
b[x/10%10]=1;
b[x/100]=1;
}
bool check(int x,int y,int z)
{
memset(b,0,sizeof(b));
if(y>999 || z>999) return 0;
go(x),go(y),go(z);
for(int i=1;i<=9;++i)
if(!b[i]) return 0;
return 1;
}
int main()
{
long long A,B,C,i,j,k,cnt=0;
cin>>A>>B>>C;
for(i=123;i<=987;++i)
{
if(i*B%A || i*C%A) continue;
j=i*B/A,k=i*C/A;
if(check(i,j,k))
{
printf("%lld %lld %lld\n",i,j,k),cnt++;
cnt++;
}
}
if(!cnt) printf("No!!!\n");
return 0;
}
这个代码在洛谷上是100分,但是,
我只有明天再来搞清楚,是怎么回事。
搞清楚了,代码中有这么一句:j=iB/A,k=iC/A;
分母当然不能为0,
样例 中正好是 0 1 2
所以,需要特别加上一句,把0的情况处理一下。