D. ConstructOR
比较奇怪的数学题叭...
要求一个使之和或后都能整除.
首先中假如少于的这种一定是不存在酱紫的的.
不妨假设后面有个,为去掉那个的数.那么我同理也需要去掉个.
之后我们用把前面全部变成.
假设.
那么就可以合在一起考虑了,不妨设值为,要求%为.
.就是相当于%等于.
貌似用就好了.
而且方程是一定有解的,因为是奇数,是只含质因子的偶数,一定是.
所以好神奇诶?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int M=2;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0){x=1;y=0;return a;}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
void run()
{
ll a,b,d;
scanf("%lld%lld%lld",&a,&b,&d);
int sufa=0,sufb=0,sufd=0;
while(a%2==0) a/=2,sufa++;
while(b%2==0) b/=2,sufb++;
while(d%2==0) d/=2,sufd++;
if(min(sufa,sufb)<sufd)
{
puts("-1");
return;
}
ll A=1,ss=1;
for(int i=1;i<=30-sufd;i++) A=A*2;
for(int i=1;i<=30;i++) ss=ss*2;
ll C=(d);
ll B=((1-A)%d+d)%d;
if(B%__gcd(A,C)!=0)
{
puts("-1");
return ;
}
ll x,y;
ll D=exgcd(A,C,x,y);
ll s=C/D;
x=B/D*x;
x=(x%s+s)%s;
x=x*ss;
ss=1;
for(int i=1;i<=30;i++)
{
if(i>sufd) x+=ss;
ss=ss*2;
}
printf("%lld\n",x);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
run();
}
return 0;
}