杭电acm 1573 数论专题
这道数论题不知怎么回事,我用了数论书上的解法,也测试了许多数据,都正确,但就是通不过。还请高人分析一下。代码在下面。
我的思路:
先求一个同余式的解,再迭代求解其它同余式。如果其中一个同余式无解,那么整个同余式组就肯定无解。求解同余式时用试验法,因为模比较小(10以内)。
#include<stdio.h>
int gcd(int n,int m)
{
if(n<m)
n^=m^=n^=m;
while(m)
m^=n^=m^=n%=m;
return n;
}
int lcm(int n,int m)
{
return n/gcd(n,m)*m;
}
int Solve(int *x0,int *m0,int x1,int m1)
{
int temp=x1-*x0,i;
if((temp%gcd(*m0,m1))!=0)
return 0;
for(i=0;i<m1;++i)
if((*m0*i-temp)%m1==0)
{
*x0=*m0*i+*x0;
*m0=lcm(*m0,m1);
while(*x0<0)
*x0+=*m0;
*x0%=*m0;
break;
}
return 1;
}
int Process(int n,int m,int a[],int b[])
{
int i,flag,*x0=(int*)malloc(4),*m0=(int*)malloc(4);
*x0=b[0]; *m0=a[0];
if(m==1)
return n<b[0]?0:(n-b[0])/a[0]+1;
else
{
flag=Solve(x0,m0,b[1],a[1]);
if(!flag)
return 0;
for(i=2;i<m;i++)
{
flag=Solve(x0,m0,b[i],a[i]);
if(!flag)
return 0;
}
return n<*x0?0:(n-*x0)/(*m0)+1;
}
}
int main()
{
int t,n,m,i,a[12]={0},b[12]={0};
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;++i)
scanf("%d",a+i);
for(i=0;i<m;++i)
scanf("%d",b+i);
printf("%d\n",Process(n,m,a,b));
}
return 0;
}
[解决办法]
有可能溢出
[解决办法]
错误在于M=1这种情况下,
语句:
- C/C++ code
if(m==1) return n<b[0]?0:(n-b[0])/a[0]+1;
[解决办法]
貌似还有其它的错
[解决办法]
下面一句也做相应修改就通过了哈
- C/C++ code
return n<*x0?0:(n-*x0)/(*m0)+1;