首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

杭电acm 1573 数论课题

2012-08-14 
杭电acm 1573 数论专题这道数论题不知怎么回事,我用了数论书上的解法,也测试了许多数据,都正确,但就是通不

杭电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; 

热点排行