[YY题]HDOJ5288 OO’s Sequence
题意:求这个式子 $\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{m} f(i, j) mod (10^9 + 7)$ 的值
就是对每个区间[i, j]枚举区间中的每个数$a_i$到$a_j$, 判断这个$a$是否对[i, j]这个区间内所有数取模都不等于0, 若是,则这个区间满足条件
问有多少个满足条件的区间
比如案例是这样跑的
int ans=;
for(int i=;i<=;i++)
for(int j=i;j<=;j++)
{
for(int k=i;k<=j;k++) // 注意要枚举[i, j]中的每个数
{
bool flag=;
for(int l=i;l<=j;l++)
if(k!=l && k%l==)
flag=;
if(!flag) // 对区间内所有数取模都不等于0
ans++;
}
}
跟省赛某题很像, 计算每个数a[i]对ans的贡献
比如对于案例 1 2 3 4 5
1这个数字对于答案的贡献是{1}, {1, 2}, {1, 2, 3}, {1, 2, 3, 4}, {1, 2, 3, 4, 5} 这5个区间
2 这个数字对于答案的贡献是{2}, {2, 3}, {2, 3, 4}, {2, 3, 4, 5} 这4个区间 ( {1, 2}区间不满足,因为2%1==0 )
... ...
来看4 这个数
它往左取区间 {4}, {3, 4} 当取到2的时候, 发现4%2==0了,那么就不必再往左了(对于连续的区间, 再往左则必定会经过2,那么该区间就不合法了)
同理,可以想到往右取, 当找到一个数被它取模等于0, 那么就不必再往右了
好了,现在对于一个数a[i], 它左边 到 不合法的数(被它取模等于0)为止 之间有x个数, 右边到不合法的数为止 有y个数
那么a[i]这个数对答案的贡献就是(x+1)*(y+1)
为什么呢?
因为是连续的区间, 所以这个区间的左端点可以取a[i]左边0个数、1个数、2个数... ...x个数;右边0个数、1个数、2个数... ...y个数
左边有(x+1)种取法,右边有(y+1)种, 相乘就是总取法数
那么我们只要找到离a[i]最近的一左一右两个不合法数的位置$l$和$r$, 那么$(i-l)*(r-i)$ 就是a[i]的贡献($i-l-1$就是上面所讲的x)
之后只要遍历每个a, 将每个a的贡献累加起来即是最后答案。
那么现在问题就转化成了如何求一个 离它最近的 能被它整除的数 的位置
我们是这样做的:
开个数组将每个a[i]的倍数都记为i (比如 a[0]=2, 那么就将2、4、6... ...10000 都记下0号位置;a[x]=y, 就将y、2y、3y... ... 都记下x位置)
就跟筛因子一样 (因为1比较特殊,会退化到$n^2$, 因此特殊处理) 复杂度为O(NlogN) (N为10000, 因为数最大为10000)
for(int i=;i<n;i++)
{
if(a[i]==)
one.push_back(i);
else
for(int j=a[i];j<=;j+=a[i])
b[j].push_back(i);
}
因为是按顺序遍历了a数组, 所以记下的位置(比如2 2 3 6 12 对于12记下的是0 1 2 3 4 )一定是递增的
那么就可以二分来寻找离$i$最近的位置
p.s. lower_bound 找的是大于等于x的数位置
upper_bound找的是大于x的数的位置
const LL mod=1e9+;
int a[];
vector<int> b[];
vector<int> one;
int read()
{
char ch=' ';
int ans=;
while(ch<'' || ch>'')
ch=getchar();
while(ch<='' && ch>='')
{
ans=ans*+ch-'';
ch=getchar();
}
return ans;
} int main()
{
// freopen("1001.in", "r", stdin);
// freopen("out.txt", "w", stdout);
int n;
while(~scanf("%d", &n))
{
for(int i=;i<n;i++)a[i]=read();
// scanf("%d", &a[i]);
for(int i=;i<=;i++)
{
b[i].clear();
b[i].push_back(-);
}
one.clear();
one.push_back(-);
for(int i=;i<n;i++)
{
if(a[i]==)
one.push_back(i);
else
for(int j=a[i];j<=;j+=a[i])
b[j].push_back(i);
}
for(int i=;i<=;i++)
b[i].push_back(n);
one.push_back(n);
LL ans=;
for(int i=;i<n;i++)
{
int p1=lower_bound(b[a[i]].begin(), b[a[i]].end(), i)-b[a[i]].begin()-;
int p2=lower_bound(one.begin(), one.end(), i)-one.begin()-;
int l=max(b[a[i]][p1], one[p2]);
p1=upper_bound(b[a[i]].begin(), b[a[i]].end(), i)-b[a[i]].begin();
p2=upper_bound(one.begin(), one.end(), i)-one.begin();
int r=min(b[a[i]][p1], one[p2]);
// printf("%d %d\n", l, r);
ans=(ans+((i-l)*(r-i))%mod)%mod;
}
printf("%I64d\n", ans%mod);
}
return ;
}
HDOJ 5288
[YY题]HDOJ5288 OO’s Sequence的更多相关文章
- HDU 5288 OO’s Sequence 水题
OO's Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Description OO has got a array A ...
- HDU 5288——OO’s Sequence——————【技巧题】
OO’s Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- Hdu 5288 OO’s Sequence 2015多小联赛A题
OO's Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 思维题 HDOJ 5288 OO’s Sequence
题目传送门 /* 定义两个数组,l[i]和r[i]表示第i个数左侧右侧接近它且值是a[i]因子的位置, 第i个数被选择后贡献的值是(r[i]-i)*(i-l[i]),每个数都枚举它的因子,更新l[i] ...
- HDU 5288 OO‘s sequence (技巧)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5288 题面: OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- HDOJ 5288 OO’s Sequence 水
预处理出每一个数字的左右两边能够整除它的近期的数的位置 OO's Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...
- HDU 5288 OO’s Sequence [数学]
HDU 5288 OO’s Sequence http://acm.hdu.edu.cn/showproblem.php?pid=5288 OO has got a array A of size ...
- 2015 Multi-University Training Contest 1 - 1001 OO’s Sequence
OO’s Sequence Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Mean: 给定一个数列,让你求所有区间上满足 ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
随机推荐
- php 去除数组中重复元素
去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...
- 开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图
先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图 ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get i ...
- net 中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net) (转)
作者:王先荣前言 随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW.DirectShow和MediaFoundation这 三代接口.其中VFW早已被Di ...
- Silverlight中弹出网页
System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(), “_blank”,"fullscreen=yes,channelmode ...
- http 错误编号大全(转)
状态行包含HTTP版本.状态代码.与状态代码对应的简短说明信息.在大多数情况下,除了Content-Type之外的所有应答头都是可选的.但Content-Type是必需的,它描述的是后面文档的MI ...
- mysql基本知识---20151127-1
2015年11月27日,作为PHPer的我开始全面学习mysql数据库. 基本语法: 1.连接服务器: mysql>mysql -h host -u root -p 回车 输入密码(本地环境可以 ...
- WPF学习05:2D绘图 使用Transform进行控件变形
在WPF学习04:2D绘图 使用Shape绘基本图形中,我们了解了如何绘制基本的图形. 这一次,我们进一步,研究如何将图形变形. 例子 一个三角形,经Transform形成组合图形: XAML代码: ...
- MySQL性能优化的最佳20+套经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操 ...
- 安装percona-toolkit提示的报错
[root@hank-yoon export]# tar -xvf percona-toolkit_2.2.15-2.tar.gz [root@hank-yoon export]# cd percon ...
- iOS的影片播放 MediaPlayer 和 AVPlayer(转)
分类: Iphone2013-01-28 16:19 5230人阅读 评论(0) 收藏 举报 在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因 ...