题目链接:
https://ac.nowcoder.com/acm/problem/221649
思路, : 我们求出[-n , n] , 所有的元素搭配的解的个数 x 1 ( x 1 + 1 ) + x 2 ( x 2 + 1 ) x1(x1+1)+x2(x2+1) x1(x1+1)+x2(x2+1) 也就是对于左边的所有的搭配种数。之后我们通过一个unordered_map容器(变量名称:mp)先将所有的搭配种数的元素都乘一个k放入容器中, 再遍历一下所有的种类数, 我们直接 r e s + = m p [ b r r [ i ] ] res += mp[brr[i] ] res+=mp[brr[i]] 即可得到所有解的个数。
unordered_map<int,int> mp ;
for(int i = 0 ; i < cntb ; i ++ )
{
mp[k * brr[i]] ++ ;
}
int res = 0 ;
for(int i = 0 ; i < cntb ; i ++ )
{
res += mp[brr[i] ] ;
}
cout << res << endl ;
整体代码:
#include <iostream>
#include <unordered_map>
using namespace std ;
const int N = 1010 ;
int arr[N] , cnt ;
int brr[N * N ] , cntb ;
int n , k , t ;
void init()
{
for(int i = -n ; i <= n ; i ++ )
{
arr[cnt++] = i * ( i + 1 ) ;
}
for(int i = 0 ; i < cnt ; i ++)
{
for(int j = 0 ; j < cnt ;j++ )
{
brr[cntb++] = arr[i] + arr[j] ;
}
}
}
int main()
{
cin >> t ;
while(t -- )
{
cin >> n >> k ;
cnt = cntb = 0 ;
init() ;
unordered_map<int,int> mp ;
for(int i = 0 ; i < cntb ; i ++ )
{
mp[k * brr[i]] ++ ;
}
int res = 0 ;
for(int i = 0 ; i < cntb ; i ++ )
{
res += mp[brr[i] ] ;
}
cout << res << endl ;
}
return 0 ;
}