C++全排列函数next_permutatio、perv_permutation()的使用

next_permutation

next_permutation函数STL里的函数,可以将一个数组按照从字典序小到大的顺序,生成全排列。返回的类型是bool类型,当没有下一个全排列时返回false;(必要时应该对数据进行排序,初始为字典序最小的那个排列,时间复杂度O(n))
prev_permutation()函数功能是输出所有比当前排列小的排列,顺序是从大到小

群友在排列数字

题意:

生成0~n-1的全排列,问组成的数有多少个可以整除k;

全排列函数代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10];
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        a[i]=i;
    }
    ll num,ans=0;
    do{
        num=0;
        for(int i=0;i<n;i++){
            num=num*10+a[i];
        }
        if(num%k==0) ans++;
    }while(next_permutation(a, a+n));
    if(!ans) cout<<"-1"<<endl;
    else cout<<ans<<endl;
    return 0;
}

当然也可以使用递归DFS求全排列来写,代码:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e6 + 7;
const int mod = 1e9+7;
int state[12];
ll cnt = 0, n, temp = 0, k;
void dfs(int deepth) {
    if(deepth == n) {
        if(temp != 0 && temp % k  == 0) ++cnt;
    }
    else {
        for(int i = 0; i < n; ++i) {
            if(!state[i]) {
                state[i] = 1;
                temp = temp * 10 + i;
                dfs(deepth+1);
                temp -= i;
                temp /= 10;
                state[i] = 0;
            }
        }
    }
}
int main(){
    cin >> n >> k;
    dfs(0);
    if(cnt != 0) cout << cnt << endl;
    else cout << -1 << endl;
    return 0;
}
全部评论

相关推荐

02-10 21:39
Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务