AcWing 1209. 带分数
原题链接
简单
作者:
腾杨天下
,
2021-04-15 22:13:07
,
所有人可见
,
阅读 242
思路
①.首先暴力枚举123456789的全排列
②.再者枚举将目前的排列分为三段的情况,计算出三段的值n1,n2,n3
③.若(n-n1)n3==n2则cnt++,整个dfs结束之后输出cnt即可
- 为什么是(n-n1)n3==n2不是n==n1+n2/n3?因为若n2<n3则会让n2/n3计算结果为1,那么就会出现很多错误的结果使得cnt,最后答案偏大,比如说ex:n1=n-1,n2<n3,这样的n1,n2,n3明明有很多组,但是他们都能够使cnt,这样的做法就是错误的
代码
#include<iostream>
using namespace std;
int n,cnt;
int a[15],st[15];
int cal(int l,int r)
{
int ret=0;
for(int i=l;i<=r;i++)
{
ret=ret*10+a[i];
}
return ret;
}
void dfs(int x)
{
if(x==10)
{
for(int i=1;i<=7;i++)
{
for(int j=i+1;j<=8;j++)
{
int n1=cal(1,i);
int n2=cal(i+1,j);
int n3=cal(j+1,9);
if(n2==(n-n1)*n3)cnt++;
}
}
return;
}
for(int i=1;i<=9;i++)
{
if(!st[i])
{
a[x]=i;
st[i]=1;
dfs(x+1);
st[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}