JZOJ5855
有毒吧,这都卡long long(毒瘤改数据),必须用龟速乘才能过最后一个点。
题目就是让求ax+by=c的非负整数解的组数,扩欧就行了
【代码~】
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL T,ansx,ansy;
LL ksc(LL a,LL b,LL c)
{
LL ret=0;
while(b)
{
if(b&1)
ret=(ret+a)%c;
b>>=1;
a=(a+a)%c;
}
return ret;
}
LL gcd(LL a,LL b)
{
return (a%b)?gcd(b,a%b):b;
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
LL ret=exgcd(b,a%b,y,x);
y=y-a/b*x;
return ret;
}
LL Read()
{
LL i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void sc(LL x)
{
if(x>=10)
sc(x/10);
putchar(x%10+48);
}
int main()
{
T=Read();
while(T--)
{
LL x=Read(),y=Read(),z=Read();
if(x<y)
swap(x,y);
LL k=gcd(x,y);
if(z%k)
{
puts("0");
continue;
}
x=x/k,y=y/k,z=z/k;
exgcd(x,y,ansx,ansy);
ansx=(ansx%y+y)%y;
ansx=ksc(ansx,z%y,y);
ansx=(ansx%y+y)%y;
ansy=(z-x*ansx)/y;
if(ansy<0)
puts("0");
else
sc(ansy/x+1),puts("");
}
return 0;
}