【欧拉计划】32. Pandigital products

(本题取 $n=9$)

【思路】我们可以 $\mathcal O(n!)$ 获得 $1 \sim 9$ 的排列,然后在排列组成的九位数中插两个空——其中一个位于两个乘数之间(相当于乘号),另一个位于左式和右式之间(相当于等号)。最后我们检查一下等式是否正确,正确就累加进入答案:

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
#include<stdio.h>
#include<stdbool.h>
int ans,a[10];
bool vis[10],flag[10000];
void dfs(int k)
{
if(k>9)
{
for(int i=1;i<=2;++i)
{
int m1=0;
for(int j=1;j<=i;++j)m1=m1*10+a[j];
for(int j=i;j<=5-i;++j)
{
int m2=0,p=0;
for(int k=i+1;k<=i+j;++k)m2=m2*10+a[k];
for(int k=i+j+1;k<=9;++k)p=p*10+a[k];
if(m1*m2==p&&!flag[p])
{
flag[p]=true;
ans+=p;
}
}
}
return;
}
for(int i=1;i<=9;++i)
{
if(vis[i])continue;
a[k]=i;
vis[i]=true;
dfs(k+1);
vis[i]=false;
}
}
int main()
{
dfs(1);
printf("%d",ans);
return 0;
}

【欧拉计划】32. Pandigital products

https://hensier.github.io/projecteuler/32/

作者

hensier

发布于

2022-05-01

更新于

2023-01-02

许可协议

评论