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
Sample Output
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<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]]);
}