# [NOIP1998 普及组] 三连击
## 题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
## 题目描述
将 $1, 2, \ldots , 9$ 共 $9$ 个数分成 $3$ 组,分别组成 $3$ 个三位数,且使这 $3$ 个三位数构成 $1 : 2 : 3$ 的比例,试求出所有满足条件的 $3$ 个三位数。
## 输入格式
无
## 输出格式
若干行,每行 $3$ 个数字。按照每行第 $1$ 个数字升序排列。
## 样例 #1
### 样例输入 #1
```
无
```
### 样例输出 #1
```
192 384 576
* * *
...
* * *
(剩余部分不予展示)
```
#include <stdio.h>
int main()
{
int a,b,c;
for(a=123;a<=333;a++)
{
b=a*2;
c=a*3;
if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
printf("%d %d %d\n",a,b,c);
}
return 0;
}
感觉这题这么解决好磨叽,看了别人的解法,不过是c++的,是这样的
状压朴素
#include <cstdio>
using namespace std;
int main(){
for (int i=192;i<=329;i++){//枚举A最多329
int p=i,j=i<<1,k=i*3,t=0;
while (p) t|=1<<p%10-1,p/=10;//分解,第p%10位为1
while (j) t|=1<<j%10-1,j/=10;//以此类推
while (k) t|=1<<k%10-1,k/=10;
if ((t&511)==511) printf("%d %d %d\n",i,i<<1,i*3);//也就是都匹配到了
}
return 0;
}
这是c++特有的写法么