题意:解方程组a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,x属于[50,50]且x!=0输入a1,a2,a3,a4,a5,输出一共有多少种满足方程的解。
题解:左右分开,hash
#include <iostream> using namespace std; #define prime 14999 int cube[105], hash[prime][100], a[6]; void get_cube() { int t = -1; for( int i = -50; i <= 50; i++ ) { if ( i == 0 ) continue; cube[++t] = i*i*i; } } void get_hash() { int sum, temp, i, j, k; for ( i = 0; i < 100; ++i ) { for ( j = 0; j < 100; ++j ) { k = 0; sum = -(cube[i]*a[1] + cube[j]*a[2]); temp = sum % prime; if ( temp < 0 ) temp += prime; while ( hash[temp][k] != -1 ) ++k; hash[temp][k] = sum; } } } int eqs () { int i, j, k, h; int sum, temp, ans = 0; for ( i = 0; i < 100; ++i ) for ( j = 0; j < 100; ++j ) for ( k = 0; k < 100; ++k ) { sum = cube[i]*a[3] + cube[j]*a[4] + cube[k]*a[5]; temp = sum % prime; if ( temp < 0 ) temp += prime; h = 0; while ( hash[temp][h] != -1 ) { if ( hash[temp][h] == sum ) ++ans; ++h; } } return ans; } int main() { memset(cube,0,sizeof(cube)); memset(hash,-1,sizeof(hash)); for ( int i = 1; i <= 5; ++i ) scanf("%d",a+i); get_cube(); get_hash(); printf("%d\n",eqs()); return 0; }