1 条题解
-
0
自动搬运
来自洛谷,原作者为

pxb0801
平行世界,多元生活,既可以朝九晚五,又能够浪迹天涯搬运于
2025-08-24 22:40:33,当前版本为作者最后更新于2022-11-03 23:17:04,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
1.题目大意:
题目很简单:给你一个 ,问有多少种表示为 的形式,且 中的数字正好不重复不遗漏的包含数字 ~ 。
2.分析:
如果这道题去枚举 ,再去一个一个枚举 ,算出 ,最后再验证,会极其的麻烦。
我们不如这样想:将 中的所有数字连在一起,是不是就是一个 ~ 的全排列?
我们以样例为例:对于 而言,这个全排列就是
823546197。这样,我们去枚举 ~ 的全排列会轻松许多,时间上也会快很多。写代码时,可以选择手打深搜,也可以用一下 next_permutation 这个函数(非常的好用)。
当我们生成一个排列时,只需要枚举两个断点 和 ,此时下标 ~ 的就是 ; ~ 的就是 ; 到 的就是 。最后判断一下即可。
3.正确代码:
#include<bits/stdc++.h> using namespace std; int t,n,a[10]={0,1,2,3,4,5,6,7,8,9},ans; int main(){ cin>>n; while(1){ int x=0; for(int i=1;i<=7;i++){ x=x*10+a[i]; int y=0; for(int j=i+1;j<=8;j++){//枚举断点 y=y*10+a[j]; int z=0; for(int k=j+1;k<=9;k++){ z=z*10+a[k]; } if(y%z==0&&x+y/z==n){//判断是否满足条件 ans++;//满足则答案+1 } } } next_permutation(a+1,a+9+1); //检查,如果此时的全排列又回到第一次的,则跳出循环 bool ok=0; for(int i=1;i<=9;i++){ if(a[i]!=i){ ok=1; break; } } if(!ok) break; } cout<<ans; return 0; }
- 1
信息
- ID
- 5900
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者