NOIP2017普及——t4 魔法阵

#include<bits/stdc++.h>
using namespace std;
int v[40005];
int w[40050];
int a[40005],b[40005],c[40005],d[40005];
//a[x[i]]	第i个魔法品的坐标(其实是魔法值,但是我们抽象成数轴)作为a物品的次数  
int n,m;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>v[i];
		w[v[i]]++;
	}
	
	for(int i=1;i<=n/9;i++)	//dis(c,d)
	{
		int p=i*9+1,sum=0;	//p=dis(a,d)->这里指一个差;
							//sum:方案总数 
		for(int j=i*9+2;j<=n;j++)	//d的坐标
		{
			//j-p:a坐标
			//j-p+2*i b坐标 
			//w[j-p]->相当于a的坐标的数量(相同魔法值的个数)  
			//w[j-p+2*i]->相当于b的坐标的数量(相同魔法值的个数)
			//i*2=xb-xa 
			sum+=w[j-p]*w[j-p+2*i];
			//乘法原理
			//j-i:c的坐标
			d[j]+=w[j-i]*sum;
			//以j(d)为坐标 作为d出现的次数 
			c[j-i]+=w[j]*sum; 
			//以j-i(c)为坐标 作为c出现的次数 
			
			
			//对乘法原理的运用  sum为a,b搭配起来的总数量,于是可以推出这个时候d可以的方案总数以及c 
		}
		p=i*8+1,sum=0;
		for(int j=n-(i*9+1);j;j--)	//a的坐标,可以想象一
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值