Codeforces 1104 D(数论+二分+交互)

news/2024/7/8 3:50:36

传送门

题意:

让你在606060步之内猜出一个模数aaa。每次你可以输入两个数xxxyyy。如果xmod  a≥ymod  ax \mod a \ge y \mod axmodaymoda,则交互器输出"XXX",否则输出“YYY”.

题目分析:

平日里遇到交互题的机会不多,正好借着CF的机会练习一下这类题目。

对于交互题这类题,一般都是运用二分的方法,不断逼近最优解进而解决问题。(最经典的交互题就是二分猜数问题)。

言归正传,对于这个题,我们不光要运用二分去解决,而且还需要用二进制试探法


所谓二进制试探法,就是分别用[0,1],[1,2],[2,22],[22,23]......[2k,2k+1][0,1],[1,2],[2,2^2],[2^2,2^3]......[2^{k},2^{k+1}][0,1],[1,2],[2,22],[22,23]......[2k,2k+1],这些的区间将答案的区间进行缩小。而如果我们成功缩小到某个区间[a,b][a,b][a,b]时,我们就可以用二分答案去求解。


对于这个问题,我们比较容易发现,当我们进行二进制试探的时候,存在一个区间[v,2v][v,2v][v,2v]vmod&ThinSpace;&ThinSpace;a≥2vmod&ThinSpace;&ThinSpace;av\mod a \ge 2v\mod avmoda2vmoda成立,则必有a∈[v,2v]a\in[v,2v]a[v,2v]简单证明:因为a≥va\ge vav则必有vmod&ThinSpace;&ThinSpace;a=vv \mod a=vvmoda=v,而又因为a≤2va\le 2va2v,则根据取模的性质,必有2vmod&ThinSpace;&ThinSpace;a&lt;v2v \mod a&lt;v2vmoda<v

因此我们可以知道,倘若在我们二进制试探的时候,遇到了一个区间[l,r][l,r][l,r],能够让交互器输出“XXX”,则我们就可以确定答案必定在[l,r][l,r][l,r]的范围内。而这个过程极限会询问303030次。

此后,我们就可以在这个区间内进行二分。

倘如当前的枚举的区间为[l,mid][l,mid][l,mid],如果此时 lmod&ThinSpace;&ThinSpace;a≥midmod&ThinSpace;&ThinSpace;al \mod a \ge mid \mod almodamidmoda 则说明mid&gt;amid&gt; amid>a,即答案仍比当前的右区间rrr小,因此我们可以将右区间左移;反之,则将左区间右移。

#include <bits/stdc++.h>
using namespace std;
string str;
int main()
{
    cin>>str;
    int l=0,r=1;
    while(str!="end"){
        l=0,r=1;
        printf("? %d %d\n",l,r);
        cin>>str;
        while(str=="y"){
            l=r,r<<=1;
            printf("? %d %d\n",l,r);
            fflush(stdout);
            cin>>str;
        }
        while(l+1<r){
            int mid=(l+r)>>1;
            printf("? %d %d\n",l,mid);
            fflush(stdout);
            cin>>str;
            if(str=="y") l=mid;
            else r=mid;
        }
        printf("! %d\n",l+1);
        fflush(stdout);
        cin>>str;
    }
    return 0;
}

转载于:https://www.cnblogs.com/Chen-Jr/p/11007166.html


http://www.niftyadmin.cn/n/4556413.html

相关文章

c++高手来啊

示范程序如下&#xff1a;#include<iostream.h>#include<conio.h>#define N xvoid main(void){ char str[20]; char ch; int i0; cout<<"请输入密码:"; cout.flush(); chgetch(); while(ch getch()函数在库函数conio.h中定义 题目要求超级玩家在输…

esp8266必备知识

gpio定义 RX和TX为D9和D10 转载于:https://www.cnblogs.com/shubin/p/10349389.html

谁有C语言的视频教程啊

searchC%E8%AF%AD%E8%A8%80%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B&restype-1&id10000001&ty0&pattern0 ||| http://www.bc-cn.net&#xff08;编程中国&#xff09;这个网站挺不错的 自己努力啊 ||| 我这里有 曾怡教授讲解http://download.anqn.com/anqn.com-0…

谁知道C.k的详细情况.

pid105467854487079 她是药剂师 胸前 忽然就哭了 看着她好长一段时间依旧是灰色的头像 看着她签名里写着关于白先生和白夫人的小笑话 电脑幽幽的光 上线 回房间 好不容易才止了鼻血 artist_no23854 选秀&#xff1a;http://www.ent365.com/ent_userqtzy/profile.asp page1 CK最…

JSP页面中定义class类导致的JSTL语法异常

1.首先我在Jsp页面中 定义一个User1 类&#xff0c;然后用EL来遍历这个类的集合userList <%class User1{private String name;private int age;public User1(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void se…

听天书似的 无从下手 这么办 C语言怎么入门

] ||| C语言不难 主要是理解 概念理解了就要靠练习了 ||| 你上网看看教程吧 我都这样开始学的 到后面自己就可以开始自己编写先自己喜欢的程序了 一句句理解每句的意思啊 然后自己按自己的理解改程序 最好就是自己把程序多打点 去看吧 感觉挺简单的 不过算好我们先是学了&#…

关于改进粒子滤波算法问题 救命啊

图1描述的是状态转移环节 图中“○”表示跟踪目标在该时刻的真实位置 能够在很大程度上解决上述问题 由图发现 黑点表示该时刻的粒子 当前时刻所有粒子对应的位置服从均匀分布 根据这种先验知识 超出1/2粒子传播半径的粒子 离“○”越近的粒子权值越大 黑点的大小代表粒子权值的…

《学习之道》第六章学习方法23与小恶魔较劲

练习与小恶魔较劲 你是不是喜欢早上一起床先查查电子邮件&#xff0c;逛逛weibo&#xff1f;你可以改变一下&#xff0c;先定时工作10分钟&#xff0c;然后奖励自己上会儿网。让你惊讶的是&#xff0c;这个自我控制的小练习将你的一整天都充满对抗小恶魔的力量。 提醒&#xff…