关于next_permutation 例题:[P4163 [SCOI2007]排列
Posted sjsjsj-minus-si
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于next_permutation 例题:[P4163 [SCOI2007]排列相关的知识,希望对你有一定的参考价值。
ouyang语重心长:一定要把这个函数名记到哦!来,我们一起念一道:next_permunation
看来我英语还是太撇了……
STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。
算法思想:
1.首先从最尾端开始往前寻找两个相邻元素,令第一元素为i,第二元素为ii,且满足i<ii。
2.找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于i的元素,令为j,将i,j元素对调(swap)。
3.再将ii之后的所有元素颠倒(reverse)排序。
例题P4163 [SCOI2007]排列
/*
1.next_permutation前必须排序不然不是全排列
2.感叹一句:stl大发好啊!就不用去重了!!!
*/
#include <bits/stdc++.h>
using namespace std;
char a1[15];
int a[15];
int main()
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",a1);
int len=strlen(a1);
memset(a,0,sizeof(a));
for(int i=0;i<=len-1;i++)
a[i+1]=a1[i]-'0';
sort(a+1,a+len+1);//next_permutation前必须排序不然不是全排列
int mod,cnt=0;
scanf("%d",&mod);
do
long long q=0; //防止爆
for(int i=1;i<=len;i++)
q=q*10+a[i]; //将数组转化成数 避免高精除法
if(q%mod==0)
cnt++;
while(next_permutation(a+1,a+len+1));
printf("%d\n",cnt);
return 0;
以上是关于关于next_permutation 例题:[P4163 [SCOI2007]排列的主要内容,如果未能解决你的问题,请参考以下文章