这场是第一场没有米的BC...

  大概也是想震一震那些一听说没米了就不打BC的人吧

  这次的题目质量比以往高了许多

  (然而我并没有打这一场BC

  但是今天下午到现在做的过程中真的学到了不少知识呢


  A题略水...

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
int T,n;
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
int tmp;
for (int i=;i<=sqrt(n);i++) if (n%i==) tmp=i;
printf("%d\n",*(n/tmp+tmp));
}
return ;
}

  然而第二题就不是非常简单的呢...

  开始啊..我打算数位DP搞搞,然而突然发现排列是不能有重复数字的啊...

  想到一个容易入手的状态 也就解决了这道题

  我们需要让这些排列都小于读进来的排列

  然后思考一下这些排列都有什么共性呢?

  显然一定是由一段与排列相同的数字组成的前缀构成的,而接下来的一位一定小于排列,剩下的就随意了

  这么一来好像问题就迎刃而解了

  枚举与原串相同的位数(0~n-1),以及接下来一位的数字(小于原串该位置上的数字且在前面的位置中没出现过)

  

  设当前枚举的黄色部分的位置为i,那么显然这样的字符串有(n-i)!种(即后面蓝色部分的n-i个数字的全排列)

  这些字符串对答案的贡献分几部分考虑

  1)红色部分内部的逆序对*(n-i)!,原串所有的前缀的逆序对数量可以通过树状数组预处理出

  2)红色部分与黄色+蓝色部分的逆序对数,

可以用树状数组维护黄色+蓝色部分的值(即每向后走一格就将前一个数从树状数组中删去)

然后枚举红色部分的每一个元素,统计逆序对数,最后乘上(n-i)!

  3)黄色部分与蓝色部分的逆序对数,直接与红色部分一样的答案最后-1即可(即把自己与自己减掉),

当然get的时候传参改成数值-1也是可以的

  4)蓝色部分的逆序对数,这个在(n-i)!个字符串中都是不一样的,于是我们可以考虑总数

对于一个n个数的排列,我们考虑其中的两个数,它们成为逆序对的次数为C(n,2)*(n-2)!

所以逆序对总数为C(n,2)^2*(n-2)!

  然后这道题就做完了,但是却对拍了一个下午都没找出哪里写错...

  最后写两点做题过程中积累的东西吧...

  1)C++的数组和Pas毕竟不一样...赋值啊什么的不能顶到maxn..而且居然本地不会出现RE

  2)while not eof do 在C++里是以很奇怪的方式替代的呢...

 #include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#define tt 1000000007
#define maxn 110
#define ll long long
using namespace std;
int n,a[maxn],tr[maxn];
ll w[maxn],p[maxn],b[maxn];
bool used[maxn];
int get(int x){
int tmp=;
while (x) tmp+=tr[x],x-=x&(-x);
return tmp;
}
void put(int x,int y){
while (x<=n) tr[x]+=y,x+=x&(-x);
}
void build(){
w[]=;for(int i=;i<maxn;i++) w[i]=(w[i-]*i)%tt;
p[]=;for (int i=;i<maxn;i++) {
ll tmp=i*(i-)/;
p[i]=((tmp*tmp%tt)*w[i-])%tt;
}
}
void solve(){
ll ans=;
memset(tr,,sizeof(tr));
for (int i=;i<=n;i++) b[i]=(b[i-]+get(n-a[i]+))%tt,put(n-a[i]+,);
memset(tr,,sizeof(tr));
memset(used,true,sizeof(used));
for (int i=;i<=n;i++) put(i,);
for (int i=;i<=n;i++){
if (i!=) put(a[i-],-),used[a[i-]]=false;
for (int j=;j<a[i];j++) if (used[j]){
ll tmp=b[i-];for (int k=;k<i;k++) tmp=(tmp+get(a[k]))%tt;
if (j!=) tmp=(tmp+get(j-))%tt;
tmp=((tmp*w[n-i])+p[n-i])%tt;
ans=(ans+tmp)%tt;
}
}
cout<<ans<<endl;
}
int main(){
build();
while (cin>>n){
for (int i=;i<=n;i++) scanf("%d",a+i);
solve();
}
return ;
}

  


  浓浓的数学味...于是又得去补充几个知识了呢

  首先带取模的组合数是不能直接求解的...因为一旦C(n,m)中假设n>模数p,n!中就会出现p这个因子

  然后C(n,m)就不可避地计算出了0...

  这个时候要用到Lucas定理,递归定义  

 ll lucas(int n,int m){
if (m==) return ;
if (n<tt&&m<tt) return c(n,m);
return lucas(n/tt,m/tt)*lucas(n%tt,m%tt)%tt;
}

  另一个就是连续的组合数快速求解...

  刚开始我一直在寻找同一行之间的关系..因为毕竟之前如果是整行是可以直接算的

  然而实际上列存在着一定的关系

  我们考虑这样一列上连续一段的求解(如图中红色部分)  

  根据杨辉三角的构造方法,C(n,m)=C(n-1,m)+C(n-1,m-1)

  我们设4号格子的位置为(i,a)

  最顶端红色格子的位置为(i,b)

  C(a+1,i+1)=C(a,i)+C(a,i+1) → C(a,i)=C(a+1,i+1)-C(a,i+1)

  显然...sigma(C(i,j))(a<=j<=b)=C(a+1,i+1)-C(b,i+1)

  在图中也就是橙色格子-蓝色格子

  然后对于每一列求解就可以了,但是要注意可能a,b不是真正的a,b

  因为我们现在考虑的是建立在红色部分都至少为1的基础上的,于是对于每一列都要对行标号进行处理

  另外还要注意,即使实际代表意义上不可能但取模意义下的减法可能会减出负的,也要处理

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxn 100010
#define ll long long
int x1,y1,x2,y2,tt;
ll fac[maxn],inv[maxn];
int max(int a,int b){
if (a>b) return a;
return b;
}
ll mul(ll a,ll b){
ll ans=,w=a;
while (b){
if (b%==) ans=ans*w%tt;
w=w*w%tt;b=b>>;
}
return ans;
}
void build(){
fac[]=;for (int i=;i<maxn;i++) fac[i]=fac[i-]*i%tt;
inv[]=;for (int i=;i<maxn;i++) inv[i]=mul(fac[i],tt-);
}
ll c(int n,int m){
return fac[n]*inv[m]%tt*inv[n-m]%tt;
}
ll lucas(int n,int m){
if (m==) return ;
if (n<tt&&m<tt) return c(n,m);
return lucas(n/tt,m/tt)*lucas(n%tt,m%tt)%tt;
}
ll query(int n,int m){
if (n<m) return ;
return lucas(n,m);
}
void solve(){
ll ans=;
for (int i=y1;i<=y2;i++) {
if (x2<i) continue;
int l=max(x1,i),r=x2;
if (l==i){l++;ans=(ans+)%tt;}
ans=(ans+query(r+,i+)-query(l,i+)+tt)%tt;
}
printf("%lld\n",ans);
}
int main(){
while (scanf("%d",&x1)!=EOF){
scanf("%d%d%d%d",&y1,&x2,&y2,&tt);
build();
solve();
}
return ;
}

  

												

BestCoder Round #40 解题报告的更多相关文章

  1. BestCoder Round #86 解题报告

    A.Price List Sol 求和查询 Code #include<cstdio> #include<algorithm> #include<iostream> ...

  2. BestCoder Round #75 解题报告

    King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...

  3. BestCoder Round #76 解题报告

    DZY Loves Partition [思路] 贪心 [代码] #include <iostream> using namespace std; typedef long long ll ...

  4. BestCoder Round #39 解题报告

    现场只做出前三题w 不过不管怎样这既是第一次认真打BC 又是第一次体验用在线编译器调代码 订正最后一题花了今天一整个下午(呜呜 收获还是比较大的^_^ Delete wld有n个数(a1,a2,... ...

  5. 浙江省队选拔 ZJOI2015 (Round 1) 解题报告

    最近莫名其妙地喜欢上了用这种格式写各省省选的全套题解= = 今年浙江省选的出题人是算法竞赛界传说级人物陈立杰,看样子他的出题风格很有特点……ABC三题难度是严格递减的,感觉如果在做第一题的时候被卡住的 ...

  6. Codeforces Round #300 解题报告

    呜呜周日的时候手感一直很好 代码一般都是一遍过编译一遍过样例 做CF的时候前三题也都是一遍过Pretest没想着去检查... 期间姐姐提醒说有Announcement也自信不去看 呜呜然后就FST了 ...

  7. BestCoder Round #40

    T1:Tom and pape (hdu 5224) 题目大意: 给出一个矩形面积N,求周长的最小值.(长&&宽&&面积都是正整数) N<=109 题解: 没啥好 ...

  8. Mango Weekly Training Round #6 解题报告

    比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41856#overview A.多种解法.可以dfs倒序染色,如mathlove ...

  9. Mango Weekly Training Round #3 解题报告

    A. Codeforces 92A Chips 签到题.. #include <iostream> #include <cstdio> #include <cstring ...

随机推荐

  1. java下执行mongodb

    1.1连单台mongodb Mongo mg = newMongo();//默认连本机127.0.0.1  端口为27017 Mongo mg = newMongo(ip);//可以指定ip 端口默认 ...

  2. 在服务器中使用 Entity Framework 的 Migration 更新数据库

    在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-databa ...

  3. RabbitMQ 安装,配置

    1:安装 yum install -y rabbitmq-server   2:主要程序介绍 # 管理插件的程序 /usr/sbin/rabbitmq-plugins # 服务程序 /usr/sbin ...

  4. (三)MySQL终极篇

    1.索引 详细介绍:http://www.cnblogs.com/57rongjielong/p/8039452.html 索引是对数据库表中一个或多个列的值进行排序的结构.索引是经过某种算法优化过的 ...

  5. "firstday"-软件工程

    阅读以下文章 http://www.thea.cn/news/terminal/9/9389.html    http://www.shzhidao.cn/system/2015/09/22/0102 ...

  6. 【week10】规格说明书练习-吉林市1日游

    假设我们全班同学及教师去吉林省吉林市1日游,请为这次活动给出规格说明书. 版本:1.0 编订:于淼 团队:2016级计算机技术全体同学 日期:2016/11/19 1.引言 1.1 编写目的 1.2 ...

  7. maven Web项目中POM的配置信息

    什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven中,当谈到Project的时候, ...

  8. rem和em学习笔记及CSS预处理

    1.当元素A的字体单位是n rem时,它将根据根元素(html)的font-size的大小作为基准,比如   parent-div中的em-div的font-size为2rem,他的基准就是html的 ...

  9. 大型Java web项目分布式架构演进-分布式部署

    http://blog.csdn.net/binyao02123202/article/details/32340283/ 知乎相关文章https://www.zhihu.com/question/2 ...

  10. Mybatis 类属性和字段映射小小分析

    在上一篇 [Mybatis 点点滴滴]博客中,写到了 Mybatis 能够将类属性和表字段自动对应起来,在 parameterType属性值直接填写 POJO 类的名称即可(首字母不区分大小写),在 ...