[数学+dfs] ZOJ 3753 Simple Equation

题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5176

Simple Equation


Time Limit: 2 Seconds      Memory Limit: 65536 KB



There are many Equations. Some are difficult to solve, for example: an xn + an-1 xn-1 + .. + a0 = 0.

In this problem, you are given a simple equation: AX + BY = XY. To simplify the problem, here ABXY are positive integers.
Your task is to find the solution (X, Y) of this equation where X is not less than M. If there are multiple solutions, you should choose the solution with the minimal X + Y. If there are still ties, you should choose the solution
with the minimalX.

Input

There are multiple test cases (about 3000). For each test case:

There is only one line contains three integers AB (1 <= AB <= 10 ^ 9) and M (1 <= M <= 10 ^ 18).

Output

For each test case, output X and Y. If there is no valid solution, output "No answer" instead.

Sample Input

1 1 2
1 1 3
3 4 8
3 4 9

Sample Output

2 2
No answer
8 6
10 5

Author: LIANG, Mingqiang

Source: ZOJ Monthly, January 2014

Submit    Status

题目意思:

给定A,B,M,求方程AX+BY=XY,要求X、Y为整数,且X要大于等于M,且满足X+Y尽可能小,如果再相同取X较小的。

解题思路:

原方程等价于(X-B)(Y-A)=XY

先用素数筛选法筛选出1000000内的所有质数。

然后将A、B分解质因数,并把相同的质因数合并,然后dfs,对每个质因数枚举分给第一部分的个数,然后剩余的全部给第二部分,然后结束时比较X+Y与之前保存的值,看是否要更新。

代码:

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF ((1LL)<<(60LL))
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define N 1000000
#define Maxn 1100000
int prime[Maxn],cnt;
bool isp[N+100];
map<LL,int>myp;
LL a,b,m,Max,ansa,ansb;
map<LL,int>::iterator it;

void init() //素数筛选法筛出1000000内的质因数
{
    cnt=0;

    for(int i=0;i<=N;i++)
        isp[i]=true;
    for(int i=2;i<=N;i++)
    {
        if(!isp[i])
            continue;
        prime[++cnt]=i;
        for(int j=i;j<=N;j+=i)
            isp[j]=false;
    }
    //printf("%d\n",cnt);
}

void get(LL cur) //分解质因数并合并
{
    for(int i=1;i<=cnt&&prime[i]*prime[i]<=cur;i++)
    {
        if(cur%prime[i]==0)
        {
            while(cur%prime[i]==0)
            {
                myp[prime[i]]++;
                cur/=prime[i];
            }
        }
    }
    if(cur!=1)
        myp[cur]++;
}
void dfs(LL aa,LL bb,map<LL,int>:: iterator cur) //对每个质因数枚举分给两部分的个数
{
    LL temp=cur->first;
    int tt=cur->second;
    //printf("aa:%lld bb:%lld temp:%lld tt:%d\n",aa,bb,temp,tt);
    //system("pause");

    if(cur==myp.end())
    {
        if(aa+b>=m)
        {
             //printf("sum:%lld max:%lld\n",aa+b+bb+a,Max);
            //system("pause");
            if(aa+b+bb+a<Max)
            {
                Max=aa+b+bb+a;
                ansa=aa+b;
                ansb=bb+a;
            }
            else if(aa+b+bb+a==Max&&aa+b<=ansa) //相等的情况下保存较小的x
            {
                ansa=aa+b;
                ansb=bb+a;
            }
        }
        return ;
    }
    for(int i=0;i<=tt;i++)
    {
        cur++;
        dfs(aa*(LL)pow(temp,i),bb*(LL)pow(temp,tt-i),cur);
        cur--;
    }
}
int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);

   init();
   while(~scanf("%lld%lld%lld",&a,&b,&m))
   {
       myp.clear();
       get(a);
       get(b);

       it=myp.begin();

       Max=INF;
       //printf("%lld\n",Max);
       dfs(1,1,it);
       if(Max==INF)
            printf("No answer\n");
       else
            printf("%lld %lld\n",ansa,ansb);

       //printf("%d\n",myp.size());
   }
   return 0;
}

[数学+dfs] ZOJ 3753 Simple Equation

时间: 2024-10-19 05:18:50

[数学+dfs] ZOJ 3753 Simple Equation的相关文章

[迭代加深dfs] zoj 3768 Continuous Login

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3768 Continuous Login Time Limit: 2 Seconds      Memory Limit: 131072 KB      Special Judge Pierre is recently obsessed with an online game. To encourage users to log in, this game wi

[dfs] zoj 3736 Pocket Cube

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3736 Pocket Cube Time Limit: 2 Seconds      Memory Limit: 65536 KB Pocket Cube is a 3-D combination puzzle. It is a 2 × 2 × 2 cube, which means it is constructed by 8 mini-cubes. For

(水DFS) zoj 3583

Q - Simple Path Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3583 Appoint description:  System Crawler  (2015-04-16) Description A path with no repeated vertices of an undirected graph is calle

stack+DFS ZOJ 1004 Anagrams by Stack

题目传送门 1 /* 2 stack 容器的应用: 要求字典序升序输出,所以先搜索入栈的 3 然后逐个判断是否满足答案,若不满足,回溯继续搜索,输出所有符合的结果 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <stack> 9 #include <cmath> 10 #include <cstring> 11 #inc

DFS ZOJ 1002/HDOJ 1045 Fire Net

题目传送门 1 /* 2 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 3 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1)左下角走,x = cnt / n; y = cnt % n; 更新坐标, 4 直到所有点走完为止,因为从左边走到右边,只要判断当前点左上方是否满足条件就可以了 5 注意:当前点不能放炮台的情况也要考虑 6 g[x][y] == 'o'; 的错误半天才检查出来:) 7 */ 8 #inc

[水题+dfs] zoj 3861 Valid Pattern Lock

题意: 给n个不同的整数(3<=n<=9),问你能绘制出多少种解锁的方案. 输出方案数,以及按字典序输出每种方案. 思路: 一个很水的dfs全排列,加上特判就好了. 特判就是1->9的话就必定经过5等. 这里要注意的是. 中间所经过的数字是必须存在的. 比如要想1->9就必须有5. 5要么被用过,要么就经过5 例子就是 1 3 5 9这四个数. 实际的方案是只有2种 3 5 1 9 和 3 5 9 1 然后就是输入完排下序,保证字典序. 最后就是弱太弱了,写了2个dfs一个算个数,

[递推+dfs]ZOJ 3436. July Number

题目大意: 将一个数字的相邻两位的差(的绝对值)组成一个新的数字,不断重复,如果最后得到7,就称这个数为July Number,比如9024 – 922 – 70 – 7.题目要求1e9范围内给定区间[a, b]里July Number的个数. 思路:逆向递推,既然题目求能化成 7 的数的个数,那么就从 7 逆着找出去 18 ,29,70,81,92等,(要注意的就是:还有从07,007.....等找出去的,每个数同理: 代码: /* SKY */ #include<iostream> #in

Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】

题目链接:https://www.luogu.org/problemnew/show/P1463 题意: 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 题解: 对于一个反素数p有两个结论: 若将p表示为 ∏(a[i]^k[i])的形式,其中a[i]为质因子,k[i]为指数. (1)a[i]为从2

Latex 各种处理论文操作-插图、插表格

Latex插入图片 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 如何做到自己控制图片在latex中的位置? 在 \begin{figure} 后面加参数 [h!] 即 \begin{figure}[h!] % Requires \includegraphics[width=]{}\\ \caption{} \label{} \end{figure} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%