【遍历枚举】hdu 5288 OO’s Sequence
2015-09-20 20:43
543 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288
题意:给出一个序列,计算所有满足:存在ai使的区间内不存在ai的倍数的区间个数和
分析:从ai先两端找到不是ai倍数的两个端点了,li,ri。sum(i)=(loc(ai)-li)*(ri-loc(ai));
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100000+10;
const int maxh=10000+10;
const int mode=1000000007;
int num[maxn],r[maxn],l[maxn];
int rr[maxh],ll[maxh];
vector<int>vec[maxh];
void init()
{
for(int i=1;i<=10000;i++)//计算出10000以内每个输的倍数
for(int j=1;j*j<=i;j++)
{
if(!(i%j))
{
vec[j].push_back(i);
if(j*j!=i)
vec[i/j].push_back(i);
}
}
}
int main()
{
int n;
long long int sum;
init();
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=10000;i++)
{
ll[i]=0;
rr[i]=n+1;
}
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=n;i++)//找到每个数的做端点
{
l[i]=ll[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
ll[vec[num[i]][j]]=i;
}
for(int i=n;i>=1;i--)//找到每个数的又端点
{
r[i]=rr[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
rr[vec[num[i]][j]]=i;
}
sum=0;
for(int i=1;i<=n;i++)
{
sum+=(i-l[i])*(r[i]-i);
if(sum>=mode)
sum%=mode;
}
printf("%I64d\n",sum);
}
return 0;
}
题意:给出一个序列,计算所有满足:存在ai使的区间内不存在ai的倍数的区间个数和
分析:从ai先两端找到不是ai倍数的两个端点了,li,ri。sum(i)=(loc(ai)-li)*(ri-loc(ai));
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100000+10;
const int maxh=10000+10;
const int mode=1000000007;
int num[maxn],r[maxn],l[maxn];
int rr[maxh],ll[maxh];
vector<int>vec[maxh];
void init()
{
for(int i=1;i<=10000;i++)//计算出10000以内每个输的倍数
for(int j=1;j*j<=i;j++)
{
if(!(i%j))
{
vec[j].push_back(i);
if(j*j!=i)
vec[i/j].push_back(i);
}
}
}
int main()
{
int n;
long long int sum;
init();
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=10000;i++)
{
ll[i]=0;
rr[i]=n+1;
}
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=n;i++)//找到每个数的做端点
{
l[i]=ll[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
ll[vec[num[i]][j]]=i;
}
for(int i=n;i>=1;i--)//找到每个数的又端点
{
r[i]=rr[num[i]];
int h=vec[num[i]].size();
for(int j=0;j<h;j++)
rr[vec[num[i]][j]]=i;
}
sum=0;
for(int i=1;i<=n;i++)
{
sum+=(i-l[i])*(r[i]-i);
if(sum>=mode)
sum%=mode;
}
printf("%I64d\n",sum);
}
return 0;
}
相关文章推荐
- 利用UIEdgeInsets属性修改UIButton的图片,文字位置
- NGUI 源码分析- UIWidgetInspector
- 接口测试工具SoapUI Pro5.1.2基本使用20150920
- 使用EasyUI弹出框页面样式乱了——控制弹出框位置
- codeforces 5C C. Longest Regular Bracket Sequence(dp)
- java中break以及continue
- 黑马程序员——GUI(图形用户界面)中的AWT
- UILabel随文字的多少重置它的frame
- ViewController生命周期
- UI设计-zTree(4)
- 百度编辑器UEditor 简单使用
- UICollectionView实现书本翻页布局
- 第十八篇:UI编程练习
- IOS9 xcode7 You must rebuild it with bitcode enabled
- 关于iOS自定义UITabBar的几种方法
- 【IOS实战】UIButton 设置图片文字垂直居中排列
- 解决configure build path问题
- Leetcode_252_Implement Stack using Queues
- Lettcode_252_Implement Stack using Queues
- ubuntu 14.04安装quickbuild server (一)