月赛T2,hack我自己

学术版

InterN_NOT_FOUND @ 2024-10-02 18:30:50

rt,code:

#include<bits/stdc++.h>

namespace INstd {
    std::string Set_Nsolution = "-1";
    #define int __int128
    #define NO_SOLUTION {cout << Set_Nsolution;return 0;}

    namespace mathematicsh{
        inline int gcd(int a,int b){
            return (b==0?a:gcd(b,a%b));
        }
    }

    namespace IO{
        inline bool isnum(char ch){return ch>='0'&&ch<='9';}
        inline int read()
        {
            int x=0,f=1;char ch=getchar();
            while (!isnum(ch)){if (ch=='-') f=-1;ch=getchar();}
            while (isnum(ch)){x=x*10+ch-48;ch=getchar();}
            return x*f;
        }
        inline void out(int x,char ch){
            if(x<0){putchar('-');x=-x;}
            if(x>9)out(x/10,'/');
            putchar(x%10+'0');
            if(ch=='l')putchar('\n');
            if(ch=='s')putchar(' ');
        }
    }

    namespace Debug{
        #define err() cout<<"err "<<__LINE__<<endl,exit(0)
        #define pot(args...) \
        GPT(#args),cout<<"  Line "<<__LINE__<<"\t: ", \
        PPT(args),cout<<"\n\n"
        void PPT(){}
        template<typename TYPE,typename... TYPES>
        void PPT(const TYPE& x,const TYPES&... y){
            std::cout<<x<<' ';
            PPT(y...);
        }
        void GPT(std::string nam){std::cout<<std::setw(29)<<nam;}
    }

    using namespace std;
    using namespace mathematicsh;
    using namespace IO;
    using namespace Debug;
}

using namespace INstd;

const int mx = 4e8, prm1 = 399999959, prm2 = 399999949;

int T = read();

inline int Exgcd (int a, int b, int &x, int &y) {
    if (!b) {
        x = 1;
        y = 0;
        return a;
    }
    int d = Exgcd(b, a % b, x, y);
    int t = x;
    x = y;
    y = t - (a / b) * y;
    return d;
}

signed main()
{
    fflush(stdout);
    while (T --) {
        int x, y;
        printf("? "); out(prm1, 'l');
        fflush(stdout);
        x = read();
        fflush(stdout);

        printf("? "); out(prm2, 'l');
        fflush(stdout);
        y = read();
        fflush(stdout);

        if (x == y) {
            printf("! "); out(x, 'l');
            fflush(stdout);
            continue;
        }

        int xx = 0, yy = 0;
        Exgcd(prm1, prm2, xx, yy);
        xx *= (y - x); yy *= -(y - x);
        int k1, k2;

        k1 = (xx > 0 && xx % prm2 != 0) ? xx % prm2 : xx % prm2 + prm2;
        k2 = (yy > 0 && yy % prm1 != 0) ? yy % prm1 : yy % prm1 + prm1;

        int ans1 = k1 * prm1 + x, ans2 = k2 * prm2 + y;

        printf("! "); 

        if (ans1 % prm1 == x && ans2 % prm2 == y)
            out(ans1, 'l');
        else out(ans2, 'l');

        fflush(stdout);
    }
    return 0;
}

思路就是弄两坨大质数跑扩欧,但是我在测试手造样例时发现一个问题

我假设 m=399999958 ,运行过程:

1
? 399999959
399999958
? 399999949
9
! 159999963600002049

而且还AC了,求问


by Infinity_Fantasy @ 2024-10-02 18:41:20

@CH_mengxiang 啥叫莫名其妙过了,是可证的好吧


by InterN_NOT_FOUND @ 2024-10-02 18:41:32

@Infinity_Fantasy 怎么就没关系了,这篇去掉模板去掉一贯的空行能压进50行

而且重点难道不是手造样例错误但是AC吗


by Infinity_Fantasy @ 2024-10-02 18:43:02

@InterN_NOT_FOUND 我不用压只要20行,我指的是存在更简单的做法


by Autumn_Rain @ 2024-10-02 18:44:45

@InterN_NOT_FOUND 但是我的程序输出正确,你可以对照一下


by InterN_NOT_FOUND @ 2024-10-02 18:47:35

@Infinity_Fantasy 如果您来只是来嘲讽我的做法烂,那可以去私信骂我,有人骂我我会很高兴。

不是的话那看看这个贴在说什么


by Infinity_Fantasy @ 2024-10-02 18:50:44

@InterN_NOT_FOUND 哈哈我就是看到这题exgcd甚至crt的做法,很好奇而已,问了一下,也没说你烂哈


by InterN_NOT_FOUND @ 2024-10-02 18:51:49

@Infinity_Fantasy 没事,我自己也觉得烂)

但是我列出这题的式子感觉一眼扩欧板子就写了()


by InterN_NOT_FOUND @ 2024-10-02 18:52:26

@Autumn_Rain 谢谢,但是我本来没想到crt,我可能要重新推一下


by Autumn_Rain @ 2024-10-02 20:45:59

@Infinity_Fantasy 那您太强了,可以教一下做法吗?


by Infinity_Fantasy @ 2024-10-03 10:38:51

@Autumn_Rain 不好意思啊,昨晚睡觉去了,就是找规律,草草地写了一下,另外其实我感觉我很菜才会这种低级的方法qwq


上一页 | 下一页