NOI十连测 第三测 T1
这么二逼的题考试的时候我想了好久,我真是太弱了。。。
首先,由于ans都乘上了i*(i-1)/2,实际上要求的就是每个数的所有可能出现次数*这个数的权值。
我们发现,每个数的本质是一样的,我们记一个sum为数的总和,这样只要统计一次就OK了。
我们把每次的选择抽象成有向边,每个状态视为点,这样就构成一个有根树。
如图
我们只考虑1对答案的贡献。如图,在每层计算当前合并对答案的贡献,也就是要能得知我在这个节点选择合并1或者1的联通块,那么我能覆盖到几个叶子节点?
那么就变成O(n)的组合数学题了。。对了,组合数用到的阶乘和阶乘逆元可以O(n)预处理。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
int ans=,a[],n,cnt[],size[];
const ll Mod=;
ll sum,jcny[],jc[],f[],son[],Num[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
bool cmp(const int &a,const int &b){
return a>b;
}
ll gcd(ll a,ll b){
if (b==) return a;
else return gcd(b,a%b);
}
void exgcd(ll a,ll b,ll &x,ll &y){
if (b==){
x=;y=;
return;
}
exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
}
void init(){
jc[]=;jcny[]=;
for (ll i=;i<=n+;i++) jc[i]=(jc[i-]*i)%Mod;
ll x,y;
exgcd(jc[n+],Mod,x,y);
jcny[n+]=(x%Mod+Mod)%Mod;
for (int i=n;i>=;i--) jcny[i]=(jcny[i+]*(i+))%Mod;
}
ll C(int n,int m){
return (((jc[n]*jcny[m])%Mod)*jcny[n-m])%Mod;
}
int dfs(int x1,int x2,int x3,int x4,int x5,int num,int res){
int b[];
int Res=;
if (num==){
ans=(ans+res)%Mod;
return Res;
}
b[]=x1;b[]=x2;b[]=x3;b[]=x4;b[]=x5;
std::sort(b,b+num,cmp);
for (int i=;i<num;i++)
for (int j=i+;j<num;j++){
b[i]+=b[j];int tmp=b[j];b[j]=;std::swap(b[j],b[num-]);
Res+=dfs(b[],b[],b[],b[],b[],num-,(res+b[i])%Mod);
std::swap(b[j],b[num-]);
b[i]-=tmp;b[j]=tmp;
}
return Res;
}
ll inv(ll a){
ll x,y;
exgcd(a,Mod,x,y);
return x;
}
void sbpianfen(){
int k=dfs(a[],a[],a[],a[],a[],n,);
printf("%d\n",ans);
}
ll A(int n,int m){
return (jc[n]*jcny[n-m])%Mod;
}
ll Pow(ll x,ll y){
ll res=;
while (y){
if (y%) res=(res*x)%Mod;
x=(x*x)%Mod;
y/=;
}
return res;
}
void sxpianfen(){
ll res=;
son[]=;son[]=;
for (int i=,num=n;i<=n;i++,num--)
son[i]=(son[i-]*C(num,))%Mod;//这行
Num[n-]=;Num[n]=;Num[n+]=;Num[n+]=;
for (int i=n-,num=;i>=;i--,num++)
Num[i]=(Num[i+]*C(num+,))%Mod; //叶子
for (int i=,num=n;i<=n-;i++,num--){
res=(res+(son[i]*Num[i+])%Mod*(num-))%Mod;
}
res=(res*sum)%Mod;
printf("%lld\n",res);
}
int main(){
n=read();init();
for (int i=;i<=n;i++)
a[i]=read(),sum=(sum+a[i])%Mod;
if (n<=){sbpianfen();return ;}
if (n<=){sxpianfen();return ;}
}
NOI十连测 第三测 T1的更多相关文章
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- 「NOI十联测」奥义商店
「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...
- 「NOI十联测」黑暗
「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...
- NOI十连测 第六测 T1
思路: 用treap动态维护,记一个sum1,sum2,注意!,写treap如果有删除操作,千万不能把权值相同的分开来..,这在删除的时候会进入死循环,这是一个惨痛的教训... #include< ...
- NOI十连测 第五测 T1
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...
- NOI十连测 第四测 T1
思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...
随机推荐
- oracle starup报错
今天在linux里面安装Oracle的时候出现一个报错,忽略报错安装之后,数据库启动的时候报错: 从网上找到的解决方法: 创建实例后,进入sqlplus启动报错: sqlplus / as sysdb ...
- POJ 2152 Fire(树形DP)
题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... #include<algorithm> #incl ...
- LeetCode_Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- VS2010下测试程序性能瓶颈
之前看到Qt的有个BUGreport https://bugreports.qt-project.org/browse/QTBUG-13182 这个BUG是在windows下QFileDialog很慢 ...
- kibana 统计每天注册数
- Spring HTTP invoker 入门
一.简介 Spring开发团队意识到RMI服务和基于HTTP的服务(如,Hessian)之间的空白.一方面,RMI使用JAVA标准的对象序列化机制,很难穿透防火墙.另一方面,Hessian/Burla ...
- C++中单链表的建立和操作
准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: struct Data //数据结点类型 { string key; //关键字 string name; int age; }; ...
- (转)25个增强iOS应用程序性能的提示和技巧--初级篇
在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...
- hdoj 1863 畅通工程 最小生成树---prime算法
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1863 注意有可能出现无法生成树的情况. #include <iostream> #inclu ...
- stm32之通用定时器TIM
STM32系列的CPU,有多达8个定时器: 1.其中TMI1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动:它们的时钟有APB2的输出产生: 2.其它6个为普通定时器,时钟由 ...