[NOIP2016]魔法阵 T4

Description

六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。

大魔法师有m个魔法物品,编号分别为1,2,...,m。每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同。

大魔法师认为,当且仅当四个编号为a,b,c,d的魔法物品满足xa<xb<xc<xd,Xb-Xa=2(Xd-Xc),并且xb-xa<(xc-xb)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。

现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的A物品出现的次数,作为B物品的次数,作为C物品的次数,和作为D物品的次数。

Input

输入文件的第一行包含两个空格隔开的正整数n和m。

接下来m行,每行一个正整数,第i+1行的正整数表示

,即编号为i的物品的魔法值。

保证

, , 。每个

是分别在合法范围内等概率随机生成的。

Output

共输出m行,每行四个整数。第i行的四个整数依次表示编号为i的物品作为A,B,C,D物品分别出现的次数。

保证标准输出中的每个数都不会超过109

每行相邻的两个数之间用恰好一个空格隔开。

Sample Input

30 81247285292624

Sample Output

4 0 0 00 0 1 00 2 0 00 0 1 11 3 0 00 0 0 20 0 2 20 0 1 0

HINT

【样例解释】
共有5个魔法阵,分别为:
物品1,3,7,6,其魔法值分别为1,7,26,29;
物品1,5,2,7,其魔法值分别为1,5,24,26;
物品1,5,7,4,其魔法值分别为1,5,26,28;
物品1,5,8,7,其魔法值分别为1,5,24,26;
物品5,3,4,6,其魔法值分别为5,7,28,29。
以物品5为例,它作为A物品出现了1次,作为B物品出现了3次,没有作为C物品或者D物品出现,所以这一行输出的四个数依次为1,3,0,0。
此外,如果我们将输出看作一个m行4列的矩阵,那么每一列上的m个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。

【数据范围】

测试点编号nm
11012
21518
32025
43035
54050
65070
765100
880125
9100150
10125200
11150250
12200350
13250500
14350700
155001000
167002000
1710005000
18200010000
19500020000
201500040000
 
#include<stdio.h>
long long n,m,sum[40001],num[15001],a[15001],b[15001],c[15001],d[15001],cnt;
int main()
{
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=m;i++)
    {
        scanf("%lld",&sum[i]);
        num[sum[i]]++;
    }
    for(long long i=1;i*9+1<=n;i++)
    {
        cnt=0;
        for(long long j=i*9+2;j<=n;j++)
        {
            cnt+=num[j-7*i-1]*num[j-9*i-1];
            c[j-i]+=num[j]*cnt;
            d[j]+=num[j-i]*cnt;
        }
        cnt=0;
        for(long long j=n-i*9-1;j>=1;j--)
        {
            cnt+=num[j+i*9+1]*num[j+i*8+1];
            a[j]+=num[j+2*i]*cnt;
            b[j+2*i]+=num[j]*cnt;
        }
    }
    for(long long i=1;i<=m;i++)
        printf("%lld %lld %lld %lld\n",a[sum[i]],b[sum[i]],c[sum[i]],d[sum[i]]);
} 


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值