[NOIP2016]魔法阵 T4

Description

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

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

大魔法师认为,当且仅当四个编号为a,b,c,d的魔法物品满足xa

现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的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个数之和都应等于魔法阵的总数。所以,如果你的输出不满足这个性质,那么这个输出一定不正确。你可以通过这个性质在一定程度上检查你的输出的正确性。

【数据范围】

测试点编号 n m
1 10 12
2 15 18
3 20 25
4 30 35
5 40 50
6 50 70
7 65 100
8 80 125
9 100 150
10 125 200
11 150 250
12 200 350
13 250 500
14 350 700
15 500 1000
16 700 2000
17 1000 5000
18 2000 10000
19 5000 20000
20 15000 40000
 
#include
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]]);
} 


你可能感兴趣的:(数学问题)