看程序写结果

看程序写结果

题目描述:
LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地在练习。
这次它拿到这样的一个程序:
C++:
scanf(“%d”,&n);
for (i=1; i<=n; i++) scanf(“%d”,&a[i]);
for (i=1; i<=n; i++) for (j=1; j<=n; j++) for (k=1; k<=n; k++) for (l=1; l<=n; l++)
if (a[i]==a[j] && a[i]< a[k] && a[k]==a[l]) ans=(ans+1)%1000000007;
printf(“%d\n”,ans);
LYK 知道了所有输入数据,它想知道这个程序运行下来会输出多少。
输入格式:
第一行一个数 n,第二行 n 个数,表示 ai。
输出格式(program.out)
一个数表示答案。
输入样例:
4
1 1 3 3
输出样例:
4
数据范围:
对于 20%的数据 n<=50。
对于 40%的数据 n<=200。
对于 60%的数据 n<=2000。
对于 100%的数据 n<=100000, 1<=ai<=1000000000。
其中均匀分布着 50%的数据不同的 ai 个数<=10,对于另外 50%的数据不同的 ai 个数>=n/10。
思路:
题目的意思就是找到i,j,k,l
使得a[i]==a[j]

#include<iostream>
#include<cstdio>
#include<algorithm>
#define lon long long
using namespace std;
const int maxn=100010;
const int mod=1000000007;
lon n,a[maxn],b[maxn],s[maxn],sum[maxn];
int main()
{
    freopen("program.in","r",stdin);
    freopen("program.out","w",stdout);
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    lon tot=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;i++)
    {
        lon pos=lower_bound(b+1,b+tot+1,a[i])-b;
        sum[pos]++;
    }
    lon ans=0;
    for(lon i=tot;i>=1;i--)
    {
        sum[i]=sum[i]%mod*sum[i]%mod;
        s[i]=s[i+1]+sum[i];
        ans=(ans+sum[i]*s[i+1]%mod)%mod;
    }
    cout<<ans;
    fclose(stdin);fclose(stdout);
    return 0;
}
posted @ 2016-11-06 16:29  抽空的太阳  阅读(87)  评论(0编辑  收藏  举报