列表

详情


NC204558. 多元组

描述

牛牛又给牛妹出题了。
题目是这样的:给你一个序列a,问你存在多少三元组满足
现在牛妹为了增加难度,问存在多少个M元组,满足。由于M元组很多,答案对取模即可。

输入描述

第一行两个整数,表示序列的长度以及为元组
第二行个整数描述一个序列

输出描述

一行一个整数,对取模即可。

示例1

输入:

20 4
9 6 17 8 8 20 14 18 17 6 6 13 4 18 15 5 7 12 8 5

输出:

20

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 446ms, 内存消耗: 10480K, 提交时间: 2020-04-03 23:05:05

#include <bits/stdc++.h>

using namespace std;

const int N = 100010, M = 55, mod = 1e9 + 7;

int n, m, a[N], tr[N][M], idx;
set<int> S;
unordered_map<int, int> h;

inline int lowbit(int x){
	return x & -x;
}

void add(int x, int c, int p){
	for(int i = x; i <= idx; i += lowbit(i)) (tr[i][p] += c) %= mod;
}

int sum(int x, int p){
	int res = 0;
	for(int i = x; i; i -= lowbit(i)) (res += tr[i][p]) %= mod;
	return res;
}

int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%d", a + i), S.insert(a[i]);
	for(auto &x : S) h[x] = ++idx;
	for(int i = 1; i <= n; i++){
		int k = h[a[i]];
		add(k, 1, 1);
		for(int j = 2; j <= m; j++) add(k, sum(k - 1, j - 1), j);
	}
	printf("%d", sum(idx, m));
}

C++14(g++5.4) 解法, 执行用时: 527ms, 内存消耗: 14796K, 提交时间: 2020-04-04 20:02:59

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e5+5;
ll c[maxn][52],a[maxn],b[maxn];
void add(ll x,ll k,ll v){
    for(;x<maxn;x+=x&(-x)) (c[x][k]+=v)%=mod;
}
ll sum(ll x,ll k){
    ll ans=0;
    for(;x;x-=x&(-x)) (ans+=c[x][k])%=mod;
    return ans;
}
int main(){
    int n,k;cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
    sort(b+1,b+1+n);
    int m=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+m,a[i])-b;
    for(int i=1;i<=n;i++){
        add(a[i],1,1);
        for(int j=2;j<=k;j++){
            add(a[i],j,sum(a[i]-1,j-1));
        }
    }
    cout<<sum(n,k)<<endl;
    return 0;
}

上一题