这么二逼的题考试的时候我想了好久,我真是太弱了。。。

首先,由于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的更多相关文章

  1. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  2. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  3. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  4. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  5. 「NOI十联测」奥义商店

    「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...

  6. 「NOI十联测」黑暗

    「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...

  7. NOI十连测 第六测 T1

    思路: 用treap动态维护,记一个sum1,sum2,注意!,写treap如果有删除操作,千万不能把权值相同的分开来..,这在删除的时候会进入死循环,这是一个惨痛的教训... #include< ...

  8. NOI十连测 第五测 T1

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...

  9. NOI十连测 第四测 T1

    思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...

随机推荐

  1. LeetCode_Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  2. WPF用样式实现TextBox的虚拟提示效果

    [版权声明]本文为博主原创,未经允许禁止用作商业用途,如有转载请注明出处. 话说好多软件和网站都能实现虚拟提示,好吧这个名词是我自己起的,因为我也不知道这么形容这个效果. 效果描述:在TextBox没 ...

  3. 安卓开发中ScrollView不能用RelativeLayout的解决方案

    RelativeLayout的意义: 布局各个部件的相对布局.使得界面空间合理利用. 一.ScrollView局限: 滑动的只能是linearlayout,甚至整个布局都不能有RelativeLayo ...

  4. Prime Palindrome Golf

    Prime Palindrome Golf Do you know how to play Prime Palindrome Golf? You are given a number and your ...

  5. Sql Server 2005的1433端口打开和进行远程连接

    参考地址:http://topic.csdn.net/u/20090828/16/e693935a-99b7-4090-a6bc-0123c91183eb.html 1.如何打开sql server  ...

  6. linux中的文件结构

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

  7. 如何在自定义Listener(监听器)中使用Spring容器管理的bean

    正好以前项目中碰到这个问题,现在网上偶然又看到这个问题的博文,那就转一下吧. 原文:http://blog.lifw.org/post/46428852 感谢作者 另外补充下:在web Server容 ...

  8. Handsontable 新增一行 默认值

    效果图:

  9. GCD 延时操作

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_ ...

  10. 分割视图控制器(UISplitViewController) 改_masterColumnWidth 导致在 IOS 10中出现闪退

    默认UISplitViewController的Master和Detail的宽度是固定的,可以通过下面的方式来改变 [splitViewController setValue:[NSNumber nu ...