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

来源:互联网 发布:2016网络零售交易额 编辑:程序博客网 时间:2024/05/21 06:57

题目链接:
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 0x3f3f3f3ftypedef long long LL;const double PI = acos(-1.0);const int mod = 1e9+7;const int N = 100100;int n,m;int a[N];int l[N];int r[N];int mark[N];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;}

此代码是条理清晰,我根据他人代码打的,比起我的代码好多了。
若朋友有时间,来帮我看看我的代码,虽然麻烦点,但思路正确,不知道为什么wa了。感谢!!!

#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;const double PI = acos(-1.0);const int mod = 1e9+7;const int N = 100100;int n,m;int a[N];int re1[N];int da[N];int re2[N];int mark[N];int main(){    while(~scanf("%d",&n))    {        memset(mark,0,sizeof(mark));        LL ans = 0;        for(int i = 1; i <= n; i++)        {            scanf("%d",&a[i]);            re1[a[i]] = i;            re2[a[i]] = i;            da[a[i]] = i;        }        for(int i = 1; i <= n; i++)        {            for(int j = a[i]; j < 10010; j += a[i])            {                if(da[j] > i)                    re1[j] = i;                if(re2[j] < i && !mark[j])                {                    re2[j] = i;                    mark[j] = 1;                }            }        }        for(int i = 1; i <= n; i++)        {            int zou;            if(re1[a[i]] == i)                zou = i-1;            else                zou = i-re1[a[i]]-1;            //cout << "左 : " << zou << endl;            int you;            if(re2[a[i]] == i)                you = n-i;            else                you = re2[a[i]]-i-1;            //cout << "右 : " << you << endl;            ans = (ans + (LL)(zou+1)*(LL)(you+1)%mod)%mod;        }        printf("%I64d\n",ans%mod);    }    return 0;}
0 0