和与积 题解 简单二分查找

Posted 劝君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和与积 题解 简单二分查找相关的知识,希望对你有一定的参考价值。

题目大意:

给定两个整数 \\(a(2 \\le a \\le 2 \\times 10^9)\\)\\(b(1 \\le b \\le 10^18)\\)

判断是否存在两个正整数 \\(x\\)\\(y\\),同时满足如下两个条件:

  1. \\(x + y = a\\)
  2. \\(x \\times y = b\\)

解题思路:

\\(a - x\\) 表示 \\(y\\),可以得到面积的表达式为 \\(x \\times (a - x)\\),然后可以发现在区间 \\([1, \\fraca2]\\) 范围内,\\(x \\times (a-x)\\) 随着 \\(x\\) 的增大而增加,具有单调性,可以二分。

比如,\\(a = 50\\) 时,在区间 \\([1, 25]\\) 范围内 \\(x\\)\\(x \\times (a - x)\\) 的对应关系如下图所示:

然后就发现可以二分查找答案。

示例程序:

#include <bits/stdc++.h>
using namespace std;

int T;
long long a, b;

bool check() 
    long long l = 1, r = a / 2;
    while (l <= r) 
        long long mid = (l + r) / 2;
        if (mid * (a - mid) == b)
            return true;
        else if (mid * (a - mid) < b)
            l = mid + 1;
        else
            r = mid - 1;
    
    return false;


int main() 
    cin >> T;
    while (T--) 
        cin >> a >> b;
        puts(check() ? "YES" : "NO");
    
    return 0;

实现两个指数递减多项式的和与积

有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积。

【提示】 用带表头结点的单链表作为多项式的存储表示;要建立两个单链表;多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入、删除操作中指针的正确修改。

 

 

#include<iostream>
#include<cmath>
using namespace std;

/**
数据结构习题1
多项式的相加和相乘
@刘辉
**/
struct Node{
    int data;
    int index;
    Node* next;
};
Node *insertList(Node* head,Node* p);  //插入链表
Node *createList();           //创建链表
void printList(Node *head);  //打印链表
Node *addList(Node *p1,Node *p2); //实现加法运算

Node *createList()
{
    int index,data;
    Node *p,*head,*q;
    head = new Node;
    p = head;
    cout<<"请输入要输入的多项式a的幂指数:";
    cin>>index;
    cout<<"请输入该指数的参数:";
    cin>>data;
    while(index!=0)
    {
        q = new Node;
        q->index = index;
        q->data = data;
        p->next = q;
        p = q;
        cout<<"请输入要输入的多项式a的幂指数:";
        cin>>index;
        cout<<"请输入该指数的参数:";
        cin>>data;
    }
    p->next = NULL;
    return head;
}
//多项式相加
Node *addList(Node *p1,Node *p2)
{
    int add;
    Node *temp,*head,*p3;
    p1 = p1->next;
    p2 = p2->next;
    head = temp = new Node;
    head->next = NULL;
    while(p1&&p2)
    {
        
        if(p1->index==p2->index)
        {
            add = p2->data + p1->data;
            if(add!=0)
            {
                p3 = new Node;
                p3->index = p2->index;
                p3->data = add;
                p3->next = NULL;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        else if(p1->index<p2->index)
        {
            p3 = new Node;
            p3->data = p2->data;
            p3->index = p2->index;
            p3->next = NULL;
            p2 = p2->next;
            
        }
        else
        {
            p3 = new Node;
            p3->data = p1->data;
            p3->index = p1->index;
            p3->next = NULL;
            p1 = p1->next;
            
         }
        if(head->next ==NULL)
        {
            head->next = p3;
            temp = p3;
        }
        else
        {
            temp->next = p3;
            temp = p3;
        }
    }
    temp->next = p1?p1:p2;
    return head;
    
}

//多项式相乘
Node* mulList(Node *p1,Node *p2)
{
    Node *head,*temp,*s,*r,*q;
    head = new Node;
    head->next = NULL;
    temp = new Node;
    temp->next = NULL;
    p1 = p1->next;
    p2 = p2->next;
    for(s=p1;s;s=s->next)
    {
        for(r=p2;r;r=r->next)
        {
            q = new Node;
            temp->next = q;
            q->data = s->data * r->data;
            q->index = s->index + r->index;
            q->next = NULL;
            head = addList(temp,head);
         }
    }
    return head;
}

//打印多项式
 void printList(Node *head)
 {
     Node *p = NULL;
     p = head->next;
     if(p==NULL)
     {
         cout<<"文件为空";
     }
     else
    {
        do
        {
            if(p->data>=0)
                cout<<p->data<<"x^"<<p->index;
            else
                cout<<p->data<<"x^"<<p->index;
            if(p->next!=NULL)
                cout<<"+";
            p=p->next;
        }while(p != NULL);
    cout<<endl; 
    }
 }
 


 //主函数
int main()
{
    int i;
    Node *p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL;
    cout<<"创建第一个多项式的链表:"<<"\n";
    p1 = createList();
    cout<<"\n";
    cout<<"创建第二个多项式的链表:"<<"\n";
    p2 = createList();
    cout<<"第一个多项式为:";
    printList(p1);
    cout<<"\n"<<"第二个多项式为:";
    printList(p2);
    p3 = addList(p1,p2);        //实现多项式相加
    cout<<"\n"<<"多项式相加后为:";
    printList(p3);
    cout<<endl;
    p4 = mulList(p1,p2);        //实现多项式相乘
    cout<<"多项式相乘后为:";
    printList(p4);
    cin>>i;
    return 0;
}

 

以上是关于和与积 题解 简单二分查找的主要内容,如果未能解决你的问题,请参考以下文章

实现两个指数递减多项式的和与积

luoguP4466 [国际集训队]和与积 莫比乌斯反演

一个关于1到100之间和与积的数学题

Codeforces Round #618 (Div. 2)题解

题解 | 二分查找总结

题解——冒泡+二分查找