cogs 304. [NOI2001] 方程的解数(meet in the middle)
304. [NOI2001] 方程的解数
★★☆ 输入文件:equation1.in
输出文件:equation1.out
简单对比
时间限制:3 s 内存限制:64 MB
问题描述
已知一个n元高次方程:
其中: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;
方程的整数解的个数小于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)的更多相关文章
- codevs1735 方程的解数(meet in the middle)
题意 题目链接 Sol 把前一半放在左边,后一半放在右边 meet in the middle一波 统计答案的时候开始想的是hash,然而MLE了两个点 实际上只要排序之后双指针扫一遍就行了 #inc ...
- NOI2001 方程的解数
1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛 时间限制: 5 s 空间限制: 64000 KB 题目描述 Descripti ...
- P5691 [NOI2001]方程的解数
题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...
- NOI2001 方程的解数(双向搜索)
solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- 【poj1186】 方程的解数
http://poj.org/problem?id=1186 (题目链接) 题意 已知一个n元高次方程: 其中:x1, x2,…,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数 ...
- POJ 1186 方程的解数
方程的解数 Time Limit: 15000MS Memory Limit: 128000K Total Submissions: 6188 Accepted: 2127 Case Time ...
- 计蒜客 方程的解数 dfs
题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...
- [ NOI 2001 ] 方程的解数
\(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...
随机推荐
- HDOJ 4944 FSF’s game
http://blog.csdn.net/keshuai19940722/article/details/38519681 不明真相的补一发... FSF's game Time Limit: 900 ...
- 一个关于 UIPickerView 的 bug
首先,我下描写叙述一下bug的发生情况: 在使用UIPickerView实现选择城市的时候.出现这样一个Bug 1.在iOS 6的系统上 2.Picker的数据上省份一栏选择了"香港&quo ...
- 浅谈cocos2dx(17) 中单例管理模式
----我的生活,我的点点滴滴!. 首先明白一个问题.什么是管理者模式,管理类是用来管理一组相关对象的类,他提供了訪问对象的接口,假设这么说比較抽象的话.我们来看下cocos2dx中都有哪些类是管理类 ...
- angularjs1- ng-include
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- angularjs1-3,$apply,$watch
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- bzoj5288: [Hnoi2018]游戏
我还是太年轻了... 考场上就是直接枚举预处理当前位置左右延伸到的最远距离,好像是水了20.. 然后噶爷爷居然随机一下就AC了????mengbier #include<cstdio> # ...
- JAVA设计模式之【原型模式】
1.案例一 学生复制 package Prototype; /** * Created by Jim on 2016/10/1. */ public class Student implements ...
- 基于Apache CXF的Web Service服务端/客户端
转自:https://www.aliyun.com/zixun/wenji/1263190.html CXF服务端: package com.sean.server; import javax.jws ...
- HDU 1575 矩阵快速幂裸题
题意:中文题 我就不说了吧,... 思路:矩阵快速幂 // by SiriusRen #include <cstdio> #include <cstring> using na ...
- git提交不用每次都输入用户名密码
克隆项目二种方式: 1. 使用https url克隆, 复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...