方程的解数(difficult)

本文介绍了一种解决特定形式n元高次方程整数解计数问题的方法,采用分治策略和哈希表技术,通过两次深度优先搜索算法来计算方程在给定范围内的整数解数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

已知一个n元高次方程:

k1x1p1+k2x2p2+……+knxnpn = 0

假设未知数1≤ xi ≤M, i=1,,,n,求这个方程的整数解的个数。

Input

  第1行包含一个整数n。第2行包含一个整数M。第3行到第n+2行,每行包含两个整数,分别表示ki和pi。两个整数之间用一个空格隔开。第3行的数据对应i=1,第n+2行的数据对应i=n。

Output

仅一行,包含一个整数,表示方程的整数解的个数。

Sample Input

3
150
1 2
-1 2
1 2

Sample Output

178

思路

O(2N^3)
先搜索前三个多项式,把结果保存在hash表里,在搜索后三个多项式,如果结果为0,就加1

type
  arr=record
  s,b:longint;
end;
const maxn=6000007;
var
  n,m,i,s,d,ans:longint;
  k,p:array[0..7] of longint;
  h:array[0..maxn] of arr;
function mi(x,y:longint):longint;
begin
  if y=1 then exit(x);
  if y mod 2=1 then
    exit(sqr(mi(x,y div 2))*x)
  else exit(sqr(mi(x,y div 2)));
end;
procedure dfs(x,y:longint);
var
  t,d,i:longint;
begin
  if x>s then
    begin
      d:=abs(y);
      t:=d mod maxn;
      while h[t].s<>0 do
        begin
          if h[t].s=y then break;
          t:=(t+1) mod (maxn+1)
        end;
      h[t].s:=y;inc(h[t].b);
      exit;
    end;
  for i:=1 to m do dfs(x+1,y+k[x]*mi(i,p[x]));
end;
procedure dfs1(x,y:longint);
var
  t,d,i:longint;
begin
  if x>n then
    begin
      y:=-y;
      d:=abs(y);
      t:=d mod maxn;
      while h[t].s<>0 do
        begin
          if h[t].s=y then break;
          t:=(t+1) mod (maxn+1)
        end;
      if h[t].s=y then inc(ans,h[t].b);
      exit;
    end;
  for i:=1 to m do dfs1(x+1,y+k[x]*mi(i,p[x]));
end;
begin
  readln(n);
  readln(m);
  for i:=1 to n do readln(k[i],p[i]);
  s:=n div 2;d:=s+1;
  dfs(1,0);
  dfs1(d,0);
  writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值