hdu 5288 OO’s Sequence(计数)
2015-09-10 22:25
429 查看
[align=left]Problem Description[/align]
[align=left]Input[/align]
[align=left]Output[/align]
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Author[/align]
FZUACM
[align=left]Source[/align]
2015 Multi-University Training Contest 1
题意:
本来的题意问 枚举所有i,j ,1<=i<=j<=n, 然后计算f(i,j)和是多少。
f(l,r)的值 是 输入的数组下标 l到r中有多少 数是无法被这个区间 任意一个数整除的。
做法:
转换种思想就是 某个数num[i],在多少个区间内 可以不被区间其他任何数整除。 答案加上区间个数。
所以 可以左右两边枚举过来。
以左边枚举过来为例:
把最近出现的数 记录下来,记录到 has数组。 如num[i] 记录成has[num[i]]=i
然后把每个数的因子枚举,判断最近左边出现因子在哪。 然后那个位子+1 就是左端点了。
在同样处理出右端点, 左右端点知道就很容易算出num[i]在多少区间内符合要求 加到ans里。
View Code
OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i=1n∑j=inf(i,j) mod (109+7).
[align=left]Input[/align]
There are multiple test cases. Please process till EOF. In each test case: First line: an integer n(n<=10^5) indicating the size of array Second line:contain n numbers ai(0<ai<=10000)
[align=left]Output[/align]
For each tests: ouput a line contain a number ans.
[align=left]Sample Input[/align]
5 1 2 3 4 5
[align=left]Sample Output[/align]
23
[align=left]Author[/align]
FZUACM
[align=left]Source[/align]
2015 Multi-University Training Contest 1
题意:
本来的题意问 枚举所有i,j ,1<=i<=j<=n, 然后计算f(i,j)和是多少。
f(l,r)的值 是 输入的数组下标 l到r中有多少 数是无法被这个区间 任意一个数整除的。
做法:
转换种思想就是 某个数num[i],在多少个区间内 可以不被区间其他任何数整除。 答案加上区间个数。
所以 可以左右两边枚举过来。
以左边枚举过来为例:
把最近出现的数 记录下来,记录到 has数组。 如num[i] 记录成has[num[i]]=i
然后把每个数的因子枚举,判断最近左边出现因子在哪。 然后那个位子+1 就是左端点了。
在同样处理出右端点, 左右端点知道就很容易算出num[i]在多少区间内符合要求 加到ans里。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<stdlib.h> #include<map> #include<vector> using namespace std; #define N 100006 #define M 10006 #define MOD 1000000007 int n; int vis[M]; int a ; vector<int> G[M]; int L ; int R ; void init(){ for(int i=1;i<M;i++){ for(int j=1;j<=i;j++){ if(i%j==0){ G[i].push_back(j); } } } } int main() { init(); while(scanf("%d",&n)==1){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } memset(vis,0,sizeof(vis)); memset(L,-1,sizeof(L)); memset(R,-1,sizeof(R)); for(int i=1;i<=n;i++){ for(int j=0;j<G[a[i]].size();j++){ int tmp=G[a[i]][j]; if(vis[tmp]){ if(a[i]%tmp==0){ if(L[i]!=-1){ L[i]=max(L[i],vis[tmp]+1); } else{ L[i]=vis[tmp]+1; } } } } vis[a[i]]=i; } memset(vis,0,sizeof(vis)); for(int i=n;i>=1;i--){ for(int j=0;j<G[a[i]].size();j++){ int tmp=G[a[i]][j]; if(vis[tmp]){ if(a[i]%tmp==0){ if(R[i]!=-1){ R[i]=min(R[i],vis[tmp]-1); } else{ R[i]=vis[tmp]-1; } } } } vis[a[i]]=i; } int ans=0; for(int i=1;i<=n;i++){ if(L[i]==-1){ L[i]=1; } if(R[i]==-1){ R[i]=n; } } for(int i=1;i<=n;i++){ ans=(ans+(i-L[i]+1)*(R[i]-i+1))%MOD; } printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- uImage、zImage、bzImage、vlinzx区别
- UIday1302:标签视图控制器 UITabBarController
- ucGUI 文本显示(一)
- UIday1202:单例
- UIImageView的图片拉伸
- UIImageView的图片拉伸
- UIday1201:模态
- 【iOS7一些总结】9、与列表显示(在):列表显示UITableView
- [LeetCode] Unique Paths
- UITextField
- Rust - Unique pointers | 独一无二的指针(所有权指针)
- UITableView使用<2>UITableViewCell的介绍
- UIButton
- COCI CONTEST #3 29.11.2014 T3 SILUETA
- UIlabel
- NGUI使用图集的精灵换图片
- IOS-UI-视图控件UIview
- iOS:集合视图UICollectionView、集合视图控制器UICollectionViewController、集合视图单元格UICollectionViewCell(创建表格的另一种控件)
- CodeForces 11A - Increasing Sequence
- Illegal instant due to time zone offset transition (Asia/Shanghai)