HDU 5288 OO’s Sequence
题意:给一个序列,函数f(l, r)表示在[l, r]区间内有多少数字不是其他数字的倍数,求所有区间的f(l, r)之和。
解法:第一次打多校……心里还有点小激动……然而一道签到题做了俩点……呜呜呜……今天的题还算简单……明天就更难了……写个题解纪念一下多校……
对于序列中的每一个数,要找到从它的位置起向左右找最远连续不能被它整除的数的位置设为l和r,这个数的位置为pos,答案就是(pos - l + 1) * (r - pos + 1),只要分析一下样例就可以得到这个式子……然后为了找到l和r,先预处理出每个数的倍数,分别正序和倒序遍历序列,每次对标记用的数组更新倍数对应的因数位置,等遍历到这个倍数时就可以知道最近的因数位置了。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
vector <int> v[10005];
int num[100005];
const int mod = 1e9 + 7;
void init()
{
for(int i = 1; i < 10005; i++)
{
for(int j = 1; j * j <= i; j++)
{
if(i % j == 0)
{
v[j].push_back(i);
if(j * j != i)
v[i / j].push_back(i);
}
}
}
}
int s[10005], flag[10005];
int minn1[100005], minn2[100005];
int main()
{
int n;
init();
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
int ans = 0;
for(int i = 0; i < n; i++)
{
minn1[i] = n - 1, minn2[i] = 0;
}
memset(s, 0, sizeof s);
memset(flag, 0, sizeof flag);
for(int i = 0; i < n; i++)
{
int len = v[num[i]].size();
minn1[i] = s[num[i]];
if(flag[num[i]])
minn1[i]++;
for(int j = 0; j < len; j++)
{
flag[v[num[i]][j]] = 1;
s[v[num[i]][j]] = i;
}
}
for(int i = 0; i < 10005; i++)
s[i] = n - 1;
memset(flag, 0, sizeof flag);
for(int i = n - 1; i >= 0; i--)
{
int len = v[num[i]].size();
minn2[i] = s[num[i]];
if(flag[num[i]])
minn2[i]--;
for(int j = 0; j < len; j++)
{
flag[v[num[i]][j]] = 1;
s[v[num[i]][j]] = i;
}
}
for(int i = 0; i < n; i++)
{
ans += (i - minn1[i] + 1) * (minn2[i] - i + 1) % mod;
if(ans > mod)
ans -= mod;
}
printf("%d\n", ans);
}
return 0;
}
HDU 5288 OO’s Sequence的更多相关文章
- 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 ...
- HDU 5288 OO‘s sequence (技巧)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5288 题面: OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- 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) ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- hdu 5288 OO’s Sequence(2015多校第一场第1题)枚举因子
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288 题意:在闭区间[l,r]内有一个数a[i],a[i]不能整除 除去自身以外的其他的数,f(l,r ...
- hdu 5288 OO’s Sequence 枚举+二分
Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...
- hdu 5288 OO’s Sequence(计数)
Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...
随机推荐
- 【Cardboard】 体验 - Google Cardboard DIY及完成后简单体验
体验 - Google Cardboard DIY及完成后简单体验 今年的Google I/O最让我感兴趣的除了Material Design以外就是这个Google Cardboard了.据说是Go ...
- TOPAPI 消息通知机制
接收用户订阅消息 public class UserSubMain { public static void main(String[] args ) throws ApiException { St ...
- js注册登录审核
<script type="text/javascript"> $(function(){ $("#sendSms").click(function ...
- [转载]JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
在ajax中经常需要对元素的位置进行精确的定位,此时不仅需要获取元素自身的大小位置等属性.还需要知道页面.浏览器.滚动条等的长度和宽度.因为浏览器的兼容问题,如果使用javascript获取这些数值是 ...
- CF 136A Presents
http://codeforces.com/problemset/problem/136/A 题意 :就是输入很多数字,第 i 个数字 pi 代表着第 i 个人的礼物给了第 pi 个人,而让你输出的数 ...
- CodeForce 339:A+B+C
A题:水题.. #include<stdio.h> #include<string.h> ; char s[ maxn ]; int main(){ //freopen(&qu ...
- MVC项目总结(别人的好文章)
引用 http://www.cnblogs.com/xling/archive/2012/07/11/2587002.html
- QT的Paint 系统
下面对于QT的绘制系统做一个简要说明, 这个系统主要由三部分组成, QPainter, QPaintDevice, QPaintEngine. QPainter 是一个绘制接口类,提供绘制各种面向用 ...
- QT中16进制字符串转汉字
最经在研究AT指令接受短信,短信是unicode编码,接受后需要根据系统的编码方案进行相关的转码比如接受到了一串字符4F60597D,它是“你好”的unicode编码,一个unicode编码占两个字节 ...
- 221. Maximal Square
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ...