有时候我们会遇到类似于ax+by=c的不定方程,求解这样子的不定方程,我们一般思路是将x,y枚举出来
for(x=0;x<100;x++)
for(y=0;y<100;y++)
{
if(a*x+b*y==c)
{
printf("x=%d,y=%d",x,y);
}
}
但是如果x的规模达到一百万呢,显然用这样子的循环嵌套是非常繁琐的,不利于程序的执行。
这里,我们可以把循环转换为一层循环,具体操作是先求出特解x0,y0,再求出通解。由方程可得x=(c-by)/a,设方程为3x-5y=8,
for(int y=0;y<100;y++)
if(8-(-5*y)%3==0)
{
printf("%d",y0);
printf("x0=%d",x0);
break;
}
我们可以得到特解x0,y0,此时通解方程为x=x0+bt,y=y0-at(t=…-2,-1,0,1,2…),在这里验证一下通解方程是否成立,将通解方程代入ax+by=c,可以发现乘积项abt刚好可以消去,所以通解方程是成立的。
对于规模较大的数值,我们一般用通解方程的解法来求解。
例题
题目描述
给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。
输入
一行,包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。
输出
一个整数,即不定方程的非负整数解组数。
输入样例
2 3 18
输出样例
4
#include<stdio.h>
int main()
{
int a,b,c;
int x,y;
int count=0;
scanf("%d%d%d",&a,&b,&c);
for(x=0;x<=c/a;x++) //因为x=(c-by)/a,所以x<=c/a
{
y=(c-a*x)/b; //y=(c-ax)/b
if(a*x+b*y==c)
count++;
}
printf("%d\n",count);
return 0;
}