test20181017 B君的第二题
题意

分析
考场50分
旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组。
但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \leq 2333\)的部分分,还好。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=3e5+7,mod=1e9+7;
int n;
int a[MAXN],b[MAXN];
int rnk(int x)
{
return lower_bound(b+1,b+n+1,x)-b;
}
int f[MAXN];
int lowbit(int x)
{
return x&-x;
}
void add(int p,int v)
{
for(int i=p;i<=n+1;i+=lowbit(i))
{
(f[i] += v) %= mod;
}
}
int sum(int p)
{
int res=0;
for(int i=p;i;i-=lowbit(i))
{
(res += f[i]) %= mod;
}
return res;
}
int main()
{
freopen("hangzhou.in","r",stdin);
freopen("hangzhou.out","w",stdout);
read(n);
for(int i=1;i<=n;++i)
b[i]=read(a[i]);
sort(b+1,b+n+1);
add(n+1,1);
for(int i=1;i<=n;++i)
{
int p=rnk(a[i]);
add(p,(sum(n+1) + mod - sum(p-1)) % mod);
}
printf("%d\n",(sum(n) + mod - n) % mod);
// fclose(stdin);
// fclose(stdout);
return 0;
}
标解
其实是lucas定理的运用。这跟CTSC2017吉夫特有相似之处。
由于\(a_i<233333\),所以表示成2333进制最多有2位,所以有
\rightarrow \binom{a_i \mod{2333}}{a_j \mod{2333}} \cdot \binom{a_i / 2333}{a_j / 2333} > 0 (\mod{2333}) \\
\rightarrow a_i \mod{2333} \geq a_j \mod{2333} 且 a_i / 2333 \geq a_j / 2333
\]
转化成二维点的右上角矩阵内的方案数查询,用二维树状数组维护。
时间复杂度\(O(n \log^2 p)\)
代码实现的时候为了适应树状数组查询左下角,将下标取成相反数+p。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int mod=1e9+7,p=2333;
int c[p+7][p+7];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int y,int v)
{
for(int i=x;i<=p;i+=lowbit(i))
for(int j=y;j<=p;j+=lowbit(j))
(c[i][j] += v) %= mod;
}
int sum(int x,int y)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
(res += c[i][j]) %= mod;
return res;
}
int main()
{
freopen("hangzhou.in","r",stdin);
freopen("hangzhou.out","w",stdout);
int n;
read(n);
int ans=0;
while(n--)
{
int x,y;
read(x);
y = p - x % p;
x = p - x / p;
int t = sum(x,y);
(ans += t) %= mod;
add(x,y,t + 1);
}
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}
test20181017 B君的第二题的更多相关文章
- test20181020 B君的第二题
题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...
- B 君的第二题 (hongkong)
B 君的第二题 (hongkong) 题目大意: 一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\).用\(a[i][j]\)表示该数组\(i\)次前缀 ...
- test20181017 B君的第一题
题意 分析 考场做法 对p的幂打表发现,我们一定可以把x和y的二进制位从低到高依次调整成0. 具体而言,从0次幂开始每两个分为一组a,b,那么0,a,b,a+b组合中的一种可以将x,y的对应二进制位都 ...
- test20181016 B君的第二题
题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...
- test20181015 B君的第二题
题意 分析 考场85分 用multiset暴力,由于教练的机子飞快,有写priority_queue水过了的人. #include<cstdlib> #include<cstdio& ...
- test20181019 B君的第二题
题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...
- Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉
第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- 常见面试第二题之什么是Context
今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...
随机推荐
- python-day17--生成器
1.本质:就是迭代器 2.生成器函数: def func(): a=1 b=2 yield a #要返回的第一个值 yield b #要返回的第二个值 ret = func() #拿到一个生成器pri ...
- 标准API使用小技巧
以前我始终孜孜不倦的追求完全能满足需求的标准的API,但是在使用的过程中发现,有些API并不能完全完整的满足需求. 导致我一度很纠结. 最后想到一种方式,COPY一份标准的API,然后按照自己的需求改 ...
- List原理
ArrayList: ArrayList是一个可变数组实现,实现了List接口的所有方法,并允许存取null值.ArrayList基本上等同与Vector,但它只对writeObject()和read ...
- 如何迭代pandas dataframe的行
from:https://blog.csdn.net/tanzuozhev/article/details/76713387 How to iterate over rows in a DataFra ...
- 51nod1709复杂度分析
题解: 注意到,如果第j位有贡献,那么从i往上跳2^j,然后不能再跳超过2^j. 因此可以考虑倍增. 代码: #include<bits/stdc++.h> typedef long lo ...
- Microsoft Jet 数据库引擎 SQL 和 ANSI SQL 的比较
http://westlife063.blog.163.com/blog/static/129942096201052591210384/ Microsoft Jet 数据库引擎 SQL 和 AN ...
- Hibernate检索学习
Hibernate的检索策略:类级别的检索策略:1对多,多对多的检索策略:多对一,一对一的检索策略 1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果 2. ...
- property 的详细使用方法
property(fget=None, fset=None, fdel=None, doc=None) 俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择. prop ...
- apache的日志access_log分析
正常日志格式:客户端地址 访问者的标识 访问者的验证名字 请求的时间 请求类型 请求的HTTP代码 发送给客户端的字节数 当网站出问题时分析日志,第一步一般都不会是看访问日志.但是也不能忽视它,在 ...
- arpg网页游戏特效播放(一)
网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种.场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特 ...