看程序写结果(program)

Posted adelalove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看程序写结果(program)相关的知识,希望对你有一定的参考价值。

Time Limit:1000ms Memory Limit:64MB
题目描述
LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地
在练习。
这次它拿到这样的一个程序:
Pascal
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do for j:=1 to n do for k:=1 to n do for l:=1 to n do
if (a[i]=a[j]) and (a[i]<a[k]) and (a[k]=a[l]) then ans:=(ans+1) mod 1000000007;
writeln(ans);
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 知道了所有输入数据,它想知道这个程序运行下来会输出多少。
输入格式(program.in)
第一行一个数 n,第二行 n 个数,表示 ai
输出格式(program.out)
一个数表示答案。
输入样例
4
1 1 3 3
输出样例
16
数据范围
对于 20%的数据 n<=50
对于 40%的数据 n<=200
对于 60%的数据 n<=2000
对于 100%的数据 n<=1000001<=ai<=1000000000
其中均匀分布着 50%的数据不同的 ai 个数<=10,对于另外 50%的数据不同的 ai
>=n/10

暴力:40

正解:

好吧我们看一下就会发现找到的四个数是满足“x x y y”这个形式的,而且x<y,

我们把读入的a数组从小到大的排序,那所有相同的数字就会挨在一起了,

这样我们会得到很多段数字,这些段也是从小到大的,因为他一个数字可以用多次,

那每一个段中的数字的的组合方式就是len^2,然后把每一个段的组合数互相乘然后加和,

但是考虑一下复杂度,如果直接相乘再相加的话会超时,那么用前缀和维护一下,

搜索到一段数字的时候只需要和这段数字后面的相乘(因为后面的才大于这段数字),

另外数据范围注意一下,会炸的哦(#^.^#)

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define mod 1000000007
 6 #define ll long long
 7 using namespace std;
 8 inline ll read()
 9 {
10     ll x=0,w=1;char ch=getchar();
11     while(!isdigit(ch)){if(ch==-) w=-1;ch=getchar();}
12     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-0,ch=getchar();
13     return x*w;
14 }
15 const ll N=100010;
16 ll n,cnt,b[N],ans,a[N];
17 int main()
18 {
19     freopen("program.in","r",stdin);
20     freopen("program.out","w",stdout);
21     n=read();
22     for(ll i=1;i<=n;++i) a[i]=read();
23     sort(a+1,a+n+1);
24     a[1]=a[1];b[1]=1;cnt=1;
25     for(ll i=2;i<=n;++i)
26     {
27         if(a[i]!=a[i-1]) a[++cnt]=a[i],b[cnt]=1;
28         else b[cnt]++;
29     }
30     for(ll i=1;i<=cnt;++i) b[i]=(b[i]*b[i])%mod;
31     for(ll i=1;i<=cnt;++i) b[i]=(b[i]+b[i-1])%mod;
32     for(ll i=1;i<=cnt;++i)
33     {
34         ll tmp=b[cnt]-b[i];
35         ans=(ans+tmp%mod*(b[i]-b[i-1])%mod)%mod;
36     }
37     printf("%lld",(ans+mod)%mod);
38     return 0;
39 }

 

人生是坎坷旅途,唯有一路坚定前行。

 

以上是关于看程序写结果(program)的主要内容,如果未能解决你的问题,请参考以下文章

看代码写程序

看程序写结果

代码块练习题:看代码写程序的执行结果。

typescript Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming/angular-2/

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming