牛客练习赛42 C 出题的诀窍
题目链接:https://ac.nowcoder.com/acm/contest/393/C


这个题就是对于每个数算贡献,如果有相同的数,只计算先出现的数的贡献
对于数x,若它在前i行的数目分别为a1,a2......ai。则这个数的贡献应为:ai*x*(n-a1)*(n-a2)*.....*(n-a(i-1))*n^(m-i)次方。这样想,如果不要求不重复算,那大小就直接是ai*n^(m-1)了
(n-a1)*(n-a2)*.....*(n-a(i-1))保证了前面不会出现相同的,n^(m-i)后面则不需要顾忌,因为就算选到了相同的,也只会把前面的数算进去
这个题非常玄学,不用快读时而过,时而不过,用了快读就稳过,以后能用快读就还是尽量用吧。
代码实现:首先将所有数字从小到大排序,第二关键字为所在的行,这样一来,相同的数字排到了一起,并且相同数字且在同一行的数也排在了一起,这样就能很方便地统计每种数字,在每一行出现的次数
用前后是否相同来判断是否到了分界点,具体实现见代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=<<;
const int maxn=;
const double pi=acos(-);
const int mod=;
struct node{
int a,b;
bool operator < (const node z) const{
return a==z.a?b<z.b:a<z.a;
}
}p[maxn*maxn];
ll q[maxn];
inline void read(int &x){
char ch=x=;
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
x=x*+ch-'',ch=getchar();
}
int main(){
int n,m;read(n);read(m);
q[]=;for(int i=;i<=m;i++) q[i]=(q[i-]*n)%mod;
ll ans=,cnt=;
for(int i=;i<=m;i++) for(int j=;j<n;j++){
int x;read(x);
p[++cnt]=node{x,i};
}
sort(p+,p+cnt+);int first=;
for(int i=;i<=cnt;i++){
int t=;//t存储的是在一行里某个数x出现的次数
if(p[i].a!=p[i+].a){
int k=;ll s=;//k存储的是行数,s存储的是(n-a1)*(n-a2)......那一串
for(int j=first;j<i;j++){//之所以j=i的时候要单独拿下去加,就是因为你比较的必须保证是同一行的
if(p[j].b==p[j+].b)t++;else{
k++;
ans=(ans+(ll)p[j].a*t%mod*s%mod*q[m-k])%mod;
//cout<<233<<endl;
s=(s%mod*(n-t))%mod;
t=;
}
}
ans=(ans+(ll)p[i].a*t%mod*s%mod*q[m-k-])%mod;//这个加和循环里的加其实没区别,因为少了k++这一步q数组多减一个1
first=i+;
}
}
cout<<ans<<endl;
return ;
}
牛客练习赛42 C 出题的诀窍的更多相关文章
- 牛客练习赛42 C 出题的诀窍 (贡献,卡常)
牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...
- 牛客练习赛38 D 出题人的手环
链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...
- 牛客练习赛42 出题的诀窍(数学+hash)
出题的诀窍 题目链接:https://ac.nowcoder.com/acm/contest/393/C 题解: 由于他是在每一行选取一个元素,然后纵向来比较,这里行的顺序是不会影响的,所以我们将每一 ...
- 牛客练习赛42(A,B)
A:链接:https://ac.nowcoder.com/acm/contest/393/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 6 ...
- 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心
https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...
- 牛客练习赛42 C 反着计算贡献
https://ac.nowcoder.com/acm/contest/393/C 题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m<= ...
- 牛客练习赛42 A 字符串
题目描述 给定两个等长的由小写字母构成的串 A,BA,B,其中 |A|=|B|=n|A|=|B|=n. 现在你需要求出一个子区间 [l,r][l,r] 使得 LCP(A[l,r],B[l,r])×LC ...
- 牛客练习赛42 E.热爆了
这可能是全场最长的一份代码 问的其实是对于关键点的斯坦纳树大小 考虑补集转化,不合法的点就是它的子树中没有关键点的点和斯坦纳树根的祖先 树根不难求,关键点中dfs序最大最小点的LCA就是了 问题在前者 ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
随机推荐
- 苹果cms安装及配置详细教程
听说这个好!php+mysql的 下载 http://www.maccms.com/down.html 下载之后解压到你的网站跟目录中,就像这个样子的 后台目录 然后重要的一步来了,在ftp工具上 ...
- XMLHttpRequest请求被劫持
十几个请求中随机一个转到 <html><head><script language="javascript">setTimeout(" ...
- Java文件写入与读取实例求最大子数组
出现bug的点:输入数组无限大: 输入的整数,量大: 解决方案:向文件中输入随机数组,大小范围与量都可以控制. 源代码: import java.io.BufferedReader; import j ...
- 58.Less介绍及其与Sass的差异
Less英文官网需要开启VPN才能正常访问,如果你无法打开Less官网,建议您移步到Alexis Sellier领导的团队所译的中文官网Less中文. ——大漠 事实证明,Less——以及Sass对于 ...
- 微信小程序scroll-view不能实现下拉刷新
一般在列表展示页面,会使用到上拉加载和下拉刷新功能,在scroll-view中有bindscrolltolower事件,可以实现上拉加载功能,但是却没法实现下拉刷新. 如需同时使用两种功能,解决步骤如 ...
- 数据模型model设置、生成数据迁移文件、执行数据迁移文件
一.model的配置 1.创建数据库 2.安装pymysql 3.修改配置文件 数据库连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backen ...
- 移动端项目在ios上输入框聚焦难解决方案
由于引入fastclick导致ios端input.textarea输入框难以点击聚焦,解决方案如下: 找到项目中的fastclick依赖或在main.js中改写fastclick的focus实现.
- 虚拟机 安装centos
entOS安装 我是用VMware 12 安装的,下面是安装,打开VM主页 选择创建虚拟机 典型安装:VMwear会将主流的配置应用在虚拟机的操作系统上,对于新手来很友好. 自定义安装:自定义安装可以 ...
- Redis学习-list数据类型
list类型是一个链表结构,主要功能有push,pop等.而且list是一个双向链表,可以通过相关操作进行集合的头部或者尾部添加,删除元素. lpush key string 在key对应的list的 ...
- java与javax的区别分析(转)
Java是一种受C语言影响的编程语言.Java和Javax本质上是与Java编程语言的上下文一起使用的包.实际上Java和Javax没有区别.这只是不同的名字. Java是一种编程语言,受到C语言的影 ...