ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

poj 2635(高精度求模+同余模定理)


题目大意:给定一个大整数,这个数是两个素数的乘积,然后给定一个数L,如果这两个素数中有一个比L小,就输出BAD;不然输出GOOD
高精度求模+同余模定理:

高精度求模,一边加一边模,不过如果是100或者1000进制这些,要注意啦,如1000进制 12345 应该为12 345这样,不要弄程123 45。我就是这样错的哦!!!
同余模定理:http://hi.baidu.com/koomo007/blog/item/110cd6f58bc91964ddc47424.html

额,WA了很多次哈,先是没有想到以10进制做要TLE,后来用1000有搞错了!!!

总结:各种方法算法要吃透才行啊。不能只领略大概。计算好时间空间复杂度!
WA 3次,1次AC 954MS
#include<stdio.h>
#include
<string.h>
#include
<math.h>
char ch[155];
int prime[500005],b[1010000],a[155];
int n,tot,m;
int get_mod(int p)
{
    
int i,ans;
    ans
=0;
    
for (i=1; i<=m ; i++ )
        ans
=(ans*1000+a[i])%p;
    
return ans;
}
int main()
{
    
int i,j,k,t,len;
    memset(b,
0,sizeof(b));
    i
=2;
    tot
=0;
    
while (1)
    {
        
while (b[i])    i++;
        prime[
++tot]=i;
        j
=i;
        
if (i>1000000)
            
break;
        
while (j<=1010000)
        {
            b[j]
=1;
            j
+=i;
        }
    }

    
while (scanf("%s%d",&ch,&n)==2&&n)
    {
        m
=strlen(ch);
        i
=0;
        k
=0;
        t
=m%3;
        
if (t>0)
        {
            a[
++k]=0;
            
for (i=0; i<t ; i++ )
                a[k]
=a[k]*10+ch[i]-48;
        }
        
while (i<m)
        {
            t
=3<m-i?3:m-i;
            a[
++k]=0;
            
for (j=i; j<i+t ; j++ )
            {
                a[k]
=a[k]*10+ch[j]-48;
            }
            i
+=t;
        }
        m
=k;

        i
=1;
        
while (i<=tot&&prime[i]<n&&get_mod(prime[i]))
            i
++;

        
if (prime[i]<n)
            printf(
"BAD %d\n",prime[i]);
        
else
            printf(
"GOOD\n");
    }
    
return 0;
}

posted on 2012-04-16 21:29 wangs 阅读(1028) 评论(0)  编辑 收藏 引用 所属分类: ACM-模拟


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理