您的位置:首页 > 大数据 > 人工智能

2015 Multi-University Training Contest 1_A(hdu 5288)

2016-07-20 21:53 507 查看
题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5288

题解:题目意思是让你求所有不同区间中对于i不是因子的个数,不懂可以手动测试案例试一下。按照一般想法一定会超时的,我们换个思路,求对于每个值,有多少区间可以达到没有其因子。对于此,我们可以查找左边最远能到达的不是因子的值x,和右边最远能到达的不是因子的值y,其值为x*y+x+y+1(或者为(x+1) * (y+1))。

贴上ac代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
const double PI = acos(-1.0);
const int mod = 1e9+7;
const int N = 100100;
int n,m;

int a
;
int l
;
int r
;
int mark
;
int main()
{
while(~scanf("%d",&n))
{
memset(mark,0,sizeof(mark));
memset(r,0,sizeof(r));
memset(l,0,sizeof(l));
LL ans = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
r[i] = n+1;
for(int j = a[i]; j < 10010; j += a[i])
{
if(mark[j])
{
r[mark[j]] = i;
mark[j] = 0;
}
}
mark[a[i]] = i;
}
memset(mark,0,sizeof(mark));
for(int i = n; i >= 1; i--)
{
for(int j = a[i]; j < 10010; j += a[i])
{
if(mark[j])
{
l[mark[j]] = i;
mark[j] = 0;
}
}
mark[a[i]] = i;
}
for(int i = 1; i <= n; i++)
{
ans = (ans + (LL)(i - r[i])*(LL)(l[i] - i)%mod)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}


此代码是条理清晰,我根据他人代码打的,比起我的代码好多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: