码迷,mamicode.com
首页 > 其他好文 > 详细

关于next_permutation 例题:[P4163 [SCOI2007]排列

时间:2019-10-08 16:04:51      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:char   组合关系   scan   ace   strong   %s   ext   http   ref   

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]排列

标签:char   组合关系   scan   ace   strong   %s   ext   http   ref   

原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11635645.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!