蓝桥杯试题 算法训练 Sereja and Equality (已AC)

简介: 蓝桥杯试题 算法训练 Sereja and Equality (已AC)

蓝桥杯试题 算法训练 Sereja and Equality


资源限制


时间限制:1.0s 内存限制:512.0MB


问题描述


 (注:这是codechef上的官方翻译)

 佳佳称两个长度为n的数组A,B相似,如果对于所有i(1≤i≤n),满足C(A,Ai)=C(B,Bi)。其中C(X,x)等于满足X[j]

 对于两个排列P1,P2,佳佳定义函数F(P1,P2)等于满足P1[l…r]相似于P2 [l…r] (1≤l≤r≤n)并且P1[l…r]包含不超过E个逆序对的数对(l,r)的数目。

 现在佳佳对下面这个问题发生了兴趣:对P1,P2取遍所有n个元素的排列F(P1,P2)的总和是多少。


输入格式


 输入数据的第一行包含一个整数T——测试数据的组数。

 对于每组测试数据,仅包含一行两个整数n,E。


输出格式


 对于每组测试数据,输出一行表示结果。答案对109+7取模。


样例输入

4

2 2

2 1

2 0

1 1

样例输出

10

10

9

1


题解

当比较区间长度定下来之后方案数就跟[ l , r ] 这个区间的位置无关了。

于是我们可以直接枚举区间的长度来计算贡献。

但是光这样是不够的。

我们需要递推出1~i 的所有排列中逆序对数为j jj的排列种类数。

这个貌似就是记录一个前缀和就行了。

f [ i ] [ j ] = ∑ f [ i − 1 ] [ k ] 且j − i + 1 ≤ k ≤ j

证明就是考虑已经处理好了1~i − 1的排列。

在所有位置插入i ii的贡献。

这个思想参见[HAOI2009]逆序对数列。

剩下的递推就是简单组合数学了。


代码


#include<bits/stdc++.h>
#define N 505
#define mod 1000000007
using namespace std;
inline int read(){
  int ans=0;
  char ch=getchar();
  while(!isdigit(ch))ch=getchar();
  while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  return ans;
}
int C[N][N],f[N][N*N],T,n,k,ans,fac[N];
inline void init(){
  fac[0]=1;
  for(int i=1;i<=500;++i)fac[i]=1ll*fac[i-1]*i%mod;
  for(int i=1;i<=500;++i)C[i][0]=C[i][i]=1,C[i][1]=i;
  for(int i=2;i<=500;++i)for(int j=1;j<=i;++j){
    C[i][j]=C[i-1][j]+C[i-1][j-1];
    if(C[i][j]>=mod)C[i][j]-=mod;
  }
  int sum=0;
  f[1][0]=1;
  for(int i=2;i<=500;++i){
    sum=0;
    for(int j=0;j<=(i-1)*i/2;++j){
      sum+=f[i-1][j];
      if(sum>=mod)sum-=mod;
      f[i][j]=sum;
      if(j+1-i>=0)sum=(sum-f[i-1][j+1-i]+mod)%mod;
    }
  }
  for(int i=2;i<=500;++i)for(int j=1;j<=(i-1)*i/2;++j){
    f[i][j]+=f[i][j-1];
    if(f[i][j]>=mod)f[i][j]-=mod;
  }
}
int main(){
  init(),T=read();
  while(T--){
    n=read(),k=read(),ans=0;
    for(int i=1;i<=n;++i){
      int tmp=1ll*C[n][i]*C[n][i]%mod*f[i][min(i*(i-1)/2,k)]%mod*fac[n-i]%mod*fac[n-i]%mod*(n-i+1)%mod;
      ans+=tmp;
      if(ans>=mod)ans-=mod;
    }
    printf("%d\n",ans);
  }
  return 0;
}


相关文章
|
11月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
263 0
|
11月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
存储 机器学习/深度学习 算法
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
293 3
|
8月前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
248 6
|
8月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
204 5
|
11月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
470 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
10月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
11月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
11月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
296 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
11月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)

热门文章

最新文章