玄关求调(妹妹码风良好)
查看原帖
玄关求调(妹妹码风良好)
1062132
Danubius楼主2024/9/16 07:52
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int k[N],p[N];
int cnt1=0,cnt2=0;//两部分的计算数量 
int a[N],b[N];//分别计算两边
int n,m;
int mid,ans;//中间值和答案 

inline int Pow(int a,int b)
{
	int res=1;
	while(b)
	{
		if(b&1) res*=a;
		a*=a;
		b>>=1;
	}
	return res;
}
inline void dfsl(int fine,int all)//当前填好了几位,总和为几
{
	if(fine == mid  )//都填好了(已经dfs到叶子节点了) 
	{
		a[++cnt1]=all;
		return ;//(回溯) 
	}
	for(int i=1;i<=m;i++)//现在尝试去填写fine+1位 
	{
		dfsl(fine+1,all+Pow(i,p[fine+1]) * k[fine+1]);
	}
	
} 

inline void dfsr(int fine,int all)//当前填好了几位,总和为几
{
	if(fine == n )//都填好了(已经dfs到叶子节点了) 
	{
		b[++cnt2]=all;
		return ;//(回溯) 
	}
	for(int i=1;i<=m;i++)//现在尝试去填写fine+1位 
	{
		dfsl(fine+1,all+Pow(i,p[fine+1]) * k[fine+1]);
	}
} 

int main()
{
	cin >> n >> m;//n个未知数,每个未知数的范围
	for(int i=1;i<=n;i++)
	{
		cin >> k[i] >> p[i] ;		
	} 
	mid=n/2;
	dfsl(0,0);
	dfsr(mid,0); 
	sort(b+1,b+cnt2+1);
	for (int i = 1 ; i <= cnt1 ; i++)
	{
		ans += (upper_bound(b + 1 , b + 1 + cnt2 , -a[i]) - b) - (lower_bound(b + 1 , b + 1 + cnt2 , -a[i]) - b);
	}
	
	cout << ans;
	
	return 0;
}
2024/9/16 07:52
加载中...