看程序写结果(program)

100 篇文章 0 订阅
35 篇文章 0 订阅

看程序写结果(program)

Time Limit:1000ms Memory Limit:64MB

题目描述

LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地

在练习。

这次它拿到这样的一个程序:

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<=100000,1<=ai<=1000000000。

其中均匀分布着 50%的数据不同的 ai 个数<=10,对于另外 50%的数据不同的 ai 个

数>=n/10。


一种数的选择方案有num^2种,因为可以选同一个数,所以就相当于在两个num长的数组中一边任选一个。

那么我们用f[i]表示1~i 这一段数中选两个数作为形式A=A< B=B中A的方案数。
例如 1 1 1 2 3 3
对应的f[]数组为 1 4 9 10 11 14

我们先将a数组升序排列,然后求出f[]数组,然后从n->1,把每一种数的个数与前面的f[]相乘,即为当前这种数作为B时对答案的贡献。

看代码有助于理解:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define LL long long
const int MOD=1000000007;
using namespace std;
int n,a[100009];
LL f[100009],ans;
int main()
{
    freopen("program.in","r",stdin);
    freopen("program.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    LL num=1;f[1]=1;
    for(int i=2;i<=n;i++)
    {
        f[i]=f[i-1];
        if(a[i]==a[i-1])
        {
            f[i]=(f[i]+1ll*2*num+1);
            num++;
        }
        else
        {
            f[i]+=1;
            num=1;
        }
    }

    //for(int i=1;i<=n;i++) printf("%lld ",f[i]);puts("");

    num=1;
    for(int i=n-1;i>=1;i--)
    {
        if(a[i]==a[i+1]) num++;
        if(a[i]!=a[i+1])
        {
            ans=(ans+f[i]*(num*num%MOD))%MOD;
            num=1;
        }
    }
    printf("%lld",ans);
    return 0;
}
《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 9. 阅读下列程序片段,出运行结果。 public class Test { public static void main(String[] args) { int percent = 10; tripleValue(percent); System.out.println(percent); } public static void tripleValue(int x) { x = 3 * x; } } 代码执行后输出的结果是______。 答案:10 [解析] static 关键字应用的场合有:①用来修饰类中定义的变量,这样的变量称为类变量或静态变量。②可以用来修饰类中定义的方法,这样的方法称为静态方法。③用来修饰初始化语句块,这样的语句块常称为静态初始化语句块。static 在这里表示这个方法为类方法,不属于任何对象实例,而是类所有,描述对象的共有动作,可以用类名直接调用。在调用了tripleValue函数之后,函数的值没有返回,所以percent的值还是10。 10. 阅读下列程序片段,出运行结果。 class Shape { public Shape() { System.out.print("Shape"); } } class Circle extends Shape { public Circle() { System.out.print("Circle"); } } public class Test { public static void main(String[] args) { Shape d = new Circle(); } } 代码执行后输出的结果是______。 答案:ShapeCircle [解析] 继承是而向对象编程的一个主要优点之一,它对如何设计Java类有着直接的影响。继承有如下几点好处: ①它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其他类有什么不同即可,而且还可以动态访问其他有 关类中的信息。 ②通过继承,可以利用Java类库所提供的丰富而有用的类,这些类都已经被很好地实现。 ③当设计很大的程序时,继承可以使程序组织得层次清晰,有利于程序设计相减少错误的发生。该程序首先编了一个Shape的类,然后又编一个类Circle去继承Shape类。由于子类拥有父类所有的属性和方法,所以输出的是ShappeCircle。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值