304. [NOI2001] 方程的解数

★★☆   输入文件:equation1.in   输出文件:equation1.out   简单对比
时间限制:3 s   内存限制:64 MB

问题描述

已知一个n元高次方程:

k1xp11+k2xp22+⋯+ knxpnn=0

其中:x1, x2, …,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数。且方程中的所有数均为整数。

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

输入文件

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

输出文件

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

输入样例

3
150
1 2
-1 2
1 2

输出样例

178

约束条件

1<=n<=6;1<=M<=150;

|k1Mp1|+|k2Mp2|+⋯+|knMpn|<231

方程的整数解的个数小于2^31。

★本题中,指数Pi(i=1,2,……,n)均为正整数。
思路:meet in the middle。

计算满足 a+b+c+d+e+f=0  的数的个数

可以算 (a+b+c)+ (d+e+f) = 0

dfs两次,每次dfs一半

结果用双指针逼近法、乘法原理 O(n) 处理

dfs中 now代表计算到第几个数 ,tot代表当前的总和,tmp存储和是几,sum存储有几个和。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 3442951
using namespace std;
int n,m,half,last,sum1,sum2,ans;
int k[],p[],tmp1[MAXN],tmp2[MAXN];
int fastpow(int a,int b){
int s=;
while(b){
if(b&) s=s*a;
a=a*a;
b>>=;
}
return s;
}
void dfs(int now,int tot,int *tmp,int &sum){
if(now>last){
tmp[++sum]=tot;
return ;
}
for(int i=;i<=m;i++)
dfs(now+,tot+k[now]*fastpow(i,p[now]),tmp,sum);
}
void work(){
int cnt1,cnt2,j=sum2;
sort(tmp1+,tmp1++sum1);
sort(tmp2+,tmp2++sum2);
for(int i=;i<=sum1;i++){
while(j&&tmp1[i]+tmp2[j]>) j--;
if(!j) break;
if(tmp1[i]+tmp2[j]==){
cnt1=cnt2=;
while(i<sum1&&tmp1[i]==tmp1[i+]) cnt1++,i++;
while(j>&&tmp2[j]==tmp2[j-]) cnt2++,j--;
ans+=cnt1*cnt2;
}
}
}
int main(){
freopen("equation1.in","r",stdin);
freopen("equation1.out","w",stdout);
scanf("%d%d",&n,&m);
half=n/;
for(int i=;i<=n;i++)
scanf("%d%d",&k[i],&p[i]);
last=half;
dfs(,,tmp1,sum1);
last=n;
dfs(half+,,tmp2,sum2);
work();
cout<<ans;
}

cogs 304. [NOI2001] 方程的解数(meet in the middle)的更多相关文章

  1. codevs1735 方程的解数(meet in the middle)

    题意 题目链接 Sol 把前一半放在左边,后一半放在右边 meet in the middle一波 统计答案的时候开始想的是hash,然而MLE了两个点 实际上只要排序之后双指针扫一遍就行了 #inc ...

  2. NOI2001 方程的解数

    1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛  时间限制: 5 s  空间限制: 64000 KB     题目描述 Descripti ...

  3. P5691 [NOI2001]方程的解数

    题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...

  4. NOI2001 方程的解数(双向搜索)

    solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...

  5. Meet in the middle学习笔记

    Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...

  6. 【poj1186】 方程的解数

    http://poj.org/problem?id=1186 (题目链接) 题意 已知一个n元高次方程:   其中:x1, x2,…,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数 ...

  7. POJ 1186 方程的解数

    方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 6188   Accepted: 2127 Case Time ...

  8. 计蒜客 方程的解数 dfs

    题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...

  9. [ NOI 2001 ] 方程的解数

    \(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...

随机推荐

  1. log4j输出多个自定义日志文件,动态配置路径

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  2. BA-通讯总线-百通1419a和9841

    百通1419A线缆的简单介绍: Belden1419A- Belden电缆线1419A 多股导体—低容计算机电缆 FOR EIA RS-232/422 Belden 1419A是24 AWG(7*32 ...

  3. [Linux]第一部分-认识Linux及Linux主机规划与安装

    ctrl + alt + f1~f6 切换六个终端ctrl + alt + f7 图形化界面 startx 开启x-window桌面 ls -al /root 列出root目录 date日期 +%y/ ...

  4. 【HDOJ 2063】过山车

    [HDOJ 2063]过山车 二分图最大匹配模板题 1女对n男 问匹配最大对数 代码例如以下: #include <iostream> #include <cstdlib> # ...

  5. 【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)

    选择排序的基本思想 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,知道所有记录排序完毕.主要有两种选择排序方法:直接选择排序(或称简单选择排序)和堆排序. 直接选择排序 ...

  6. MySQL 5.7.10最新版本号源码安装具体过程

    ,重置密码 利用mysqladmin重置密码 [root@wgq_idc_mon_1_12 mysql5710]#./bin/mysqladmin -h localhost -uroot passwo ...

  7. getColor()方法过时的替代方法

    Android SDK 升級到 23 之後,getResource.getColor(R.color.color_name) 過時 使用新加入的方法 ContextCompat.getColor(co ...

  8. Android 四大组件学习之ContentProvider三

    上节课学习怎样自己创建一个ContentProvider.以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的 ...

  9. 杂项-编程:AOP(面向切面编程)

    ylbtech-杂项-编程:AOP(面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一 ...

  10. POJ 3150 循环矩阵的应用

    思路: 首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵 由于此题是距离小于d的都加上一个数. 那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵 看看数据范围 n^2log(k)可以过. 那就 ...