首页 > 其他分享 >AtCoder Regular Contest 158 D - Equation

AtCoder Regular Contest 158 D - Equation

时间:2023-04-04 21:44:15浏览次数:57  
标签:AtCoder 题目 Contest int 158 Equation 因式 return 考虑

题目链接
原本看着式子直接晕了,觉得是高深的硬核数论,于是放弃(然后E也没想出来,sad)

关键的思路在于,考虑构造由(a,b,c)->(ta,tb,tc)这样的求解方式。

在看到这个做法后,会发现它很好地利用了题目齐次的性质;至于如何由齐次式想到这个做法,可能需要足够的天赋或者经验吧(悲)

化简后得到\(At\equiv B(\mod p)\),那么只要A和B不为0 ,就可以得到一个非0的t,进而得到解!即要求得到一组(a,b,c),满足在模p下:
image
(因为p是质数,故乘积为0等价于各个因式的并)

而题目又要求\(1\le a<b<c\le p-1\),故很难直接构造出(a,b,c),使得对于任意的p成立。
但又觉得在确定p的情况下,满足条件的三元组应该很多,所以考虑随机化;只需要证明随机一次不合法的概率有一个小于1的上界即可。
由于不知道各个因式的独立性如何,故考虑最弱的概率关系,即\(并\le和\),考虑令每个式子均摊,只需证明:对任意整数k,随机一组(a,b,c),\(a^k+b^k+c^k=0\)的概率小于\(1/4\)。三项单独考虑,先把\(a,b,c\)分别转成原根对应的次幂,那么每项的结果就是在长度\(p-1\)的环上每次走\(k\)步,共有\(d=\frac{p-1}{gcd(p-1,k)}\)种取值,根据\(d\)的大小分讨即可证明。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
mt19937 rnd(time(0));
int P;
inline int fpw(int a,int x){
    int s=1;
    for(;x;x>>=1,a=1ll*a*a%P) if(x&1) s=1ll*s*a%P;
    return s;
}
int n,a,b,c;
void inc(int& x,int y){
    x+=y;
    if(x>=P) x-=P;
    if(x<0) x+=P;
}
int sum(int x,int y){
    x+=y;
    if(x>=P) x-=P;
    if(x<0) x+=P;
    return x;
}
void mul(int& x,int y){
    x=1ll*x*y%P;
}
int prd(int x,int y){
    return 1ll*x*y%P;
}
void Rand(){
    unsigned int M=P-1;
    a=rnd()%M+1;
    b=rnd()%M+1;
    c=rnd()%M+1;
}
int s0,s[4];
bool chk(){
    if(a==b || b==c || a==c) return 0;
    s0=sum(a,sum(b,c));
    if(!s0) return 0;
    for(int i=1;i<=3;i++){
        int pw=1ll*n*i%(P-1);
        s[i]=sum( fpw(a,pw),sum(fpw(b,pw),fpw(c,pw)) );
        if(!s[i]) return 0;
    }
    //cout<<prd(s0,prd(s[1],s[2]))<<" "<<s[3]<<endl;
    return 1;
}
int ans[4];
void work(){
    scanf("%d%d",&n,&P);
    Rand();
    while(!chk()) Rand();
    //puts("!");
    int t=prd(s[3],fpw(s0,P-2));
    for(int i=1;i<=2;i++) mul(t,fpw(s[i],P-2));
    mul(a,t); mul(b,t); mul(c,t);
    //chk();
    //cout<<prd(s0,prd(s[1],s[2]))<<" "<<s[3]<<endl;
    ans[1]=a; ans[2]=b; ans[3]=c;
    sort(ans+1,ans+4);
    printf("%d %d %d\n",ans[1],ans[2],ans[3]);
}
int main() {
    int T; cin>>T;
    while(T--) work();
    return 0;
}

标签:AtCoder,题目,Contest,int,158,Equation,因式,return,考虑
From: https://www.cnblogs.com/szsz/p/17288015.html

相关文章

  • AtCoder Beginner Contest 296
    AtCoderBeginnerContest296比赛连接好久没写题解了~~D-M<=ab题意就是给定N,M,求一个最小的数x同时满足x>=M且x=a*b(a<=N,b<=N);N,M<=1e12开始脑瘫想了二分,仔细一想很明显x不满足单调性,想了下暴力的时间复杂度巨大...纠结了一会,发现因子最大是sqrt(m),只需要枚举一下因......
  • AtCoder Beginner Contest 144
    AtCoderBeginnerContest144https://atcoder.jp/contests/abc144补一下3.23做的。D-WaterBottle分类讨论,三角函数。#include<bits/stdc++.h>#definepiacos(-1)usingnamespacestd;intmain(){inta,b,x;cin>>a>>b>>x;......
  • AtCoder Beginner Contest 296 A-E
    AtCoderBeginnerContest296A-Alternately1voidsolve(){2intn=read();3strings;4cin>>s;5intans=1;6for(inti=0;i<s.size()-1;i++){7if(s[i]==s[i+1])ans=0;8}9puts(ans>0?"Yes&......
  • AtCoder Beginner Contest 296
    AtCoderBeginnerContest296赛时代码A-Alternately//Problem:A-Alternately//Contest:AtCoder-AtCoderBeginnerContest296//URL:https://atcoder.jp/contests/abc296/tasks/abc296_a//MemoryLimit:1024MB//TimeLimit:2000ms////PoweredbyCP......
  • AtCoder Beginner Contest 153
    AtCoderBeginnerContest153https://atcoder.jp/contests/abc153这套比较简单。E-CrestedIbisvsMonster完全背包#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5,M=1e4+5;lln,m,a[N],b[N],f[M*2],mx;int......
  • AtCoder Beginner Contest 296
    DM<=ab枚举。复杂度\(O(\sqrt{m})\)。C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);i64n,m;cin>>n>>m;if(m&......
  • AtCoder Beginner Contest 296 ABCD
    https://atcoder.jp/contests/abc296A-Alternately#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=2e6+10,M=3023;constLLmod=100000007;cons......
  • AtCoder Beginner Contest 152
    AtCoderBeginnerContest152https://atcoder.jp/contests/abc152F我看了半天,编码方式那里还算是感觉比较玄乎,这题确实妙。D-Handstand2只需记录两端数字即可,不要想太复杂。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lln,sum,a[10][10];......
  • AtCoder Beginner Contest 295
    题解报告基本的一些理解和问题都在注释中A:ProbablyEnglish//水题#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<unordered_map>usingnamespacestd;constintmaxn=1e3+10;strings[......
  • AtCoder Beginner Contest 246
    AtCoderBeginnerContest246A(思维)A这个题大意是告诉你一个矩形的三个点,求第四个点,并且已知每条边都是平行于\(x\)轴或者是\(y\)轴的,那么我们可以确定,\(x\)坐标只有两......