比赛 NOIP水题争霸赛 评测结果 RRRRRRRRRR
题目名称 博士的密码 最终得分 0
用户昵称 sarail 运行时间 0.008 s
代码语言 C++ 内存使用 0.28 MiB
提交时间 2018-02-11 21:36:39
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=40;

vector<int> b,c,tmp;
int a[maxn];
int n,i,j,key,mid,cnt,p,x,bb,cc,ans,f;

void change(){
	int x;tmp.clear() ;
	for(int k=0;k<bb;k++){
		for(int g=k+1;g<bb;g++){
			x=b[k]+b[g];
			if(x<mid)tmp.push_back(x);
			else c.push_back(x);
			if(x==mid&&f) cnt++;
		}
	}
	b.clear();
	for(int k=0;k<tmp.size();k++)
		b.push_back(tmp[k]); 
	bb=b.size() ;cc=c.size();
}

int main(){
	freopen("password1.in","r",stdin);
	freopen("password1.out","w",stdout);
	cin>>n>>key;
	for(i=0;i<n;i++)cin>>a[i];
	sort(a,a+n);
	mid=key/2;
	if(2*mid==key)f=1;
	else f=0;
	
	ans=cnt=p=0;
	b.clear() ;c.clear() ;
	
	while(a[p]<mid+(f+1)%2){
		b.push_back(a[p]);
		p++;
	}
	for(i=p;i<n;i++){
		if(a[i<key])c.push_back(a[i]);
		if(a[i]==key)ans++; 
		if(a[i]==mid&&f)cnt++;
	}
	bb=b.size() ;cc=c.size();
 	while(bb>1){
		for(i=0;i<bb;i++){
			for(j=0;j<cc;j++){
				x=b[i]+c[j];
				if(x==key)ans++;
			}
		}
		change();
	}
	if(b.size()==1){
		x=b[0];
		for(i=0;i<cc;i++){
			if(x+c[i]==key)ans++;
		}
	}
	
	if(f)ans+=cnt*(cnt-1)/2;
	cout<<ans;
	return 0;
}