我们令
x=2pb
,
y=2pa
,
z=2(pab+1)/c
,不难发现这是一组可行解。用扩展欧几里得算法解出来
p
就可以了。
但是当
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
LL a,b,c,m;
LL pow(LL k)
{
LL ret=1;
for (LL b=2;k;k>>=1,b=b*b%m)
if (k&1) ret=ret*b%m;
return ret;
}
void exgcd(LL a,LL b,LL &x,LL &y)
{
if (!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
void solve()
{
scanf("%lld%lld%lld%lld",&m,&a,&b,&c);
LL t=m,p,q;
while (t&&!(t&1)) t>>=1;
if (t>1)
{
exgcd(a*b,c,p,q);
p=-p;
while (p<0||q<0) p+=c,q+=a*b;
printf("%lld %lld %lld\n",pow(p*b),pow(p*a),pow(q));
}
else
{
if (a>1) printf("%lld 1 1\n",m/2);
else if (b>1) printf("1 %lld 1\n",m/2);
else if (c>1) printf("%lld %lld %lld\n",m/2,m/2,m/2);
else printf("1 1 2\n");
}
}
int main()
{
//freopen("b.in","r",stdin);
int T;
scanf("%d",&T);
while (T--) solve();
}