poj 2635

http://poj.org/problem?id=2635

好久之前看过的一道题,不过一直没有什么思路, 然后突然想起来, 看了下解题报告, 真的很佩服他们

  10^100太大我们就改成用1000进制存的, 然后用同余模定理

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <string.h>


using namespace std;
int knum[1111];
char num[1111];
int prime[1000100];


void PrimeTable( )
{
    int cnt = 0;
    prime[cnt++] = 2;
    for( int i = 3; i < 1000100; i++)
    {
        bool flag = false;
        for( int j = 0; prime[j]*prime[j] <= i; j++)
        {
            if(i%prime[j] == 0)
              {
                  flag = true;
                   break;
              }
        }
        if(!flag)
          prime[cnt++] = i;
    }


}


bool check( int pos, int len)
{
    int mod = 0;
    for( int i = len-1; i >= 0; i--)
      mod = (mod * 1000 + knum[i])%prime[pos];
    if(mod)
      return false;
    return true;
}


void solve()
{
    int k;
    while(scanf("%s%d",&num, &k) != EOF && k)
    {
      int len = strlen(num);
      int bit = 0;
      for( int i = len - 1; i >= 0; i-=3)
      {
          int res = (num[i]-'0') ;
          if(i-1>=0)
            res += (num[i-1]-'0')*10 ;
          if(i-2>=0)
            res += (num[i-2]-'0')*100;
          knum[bit++] = res;
      }
      bool flag = false;
      int pos = 0;
      while(prime[pos] < k)
      {
          if(check(pos,bit))
           {
               printf("BAD %d\n",prime[pos]);
               flag = true;
               break;
           }
           pos++;
      }


     if(!flag)
       printf("GOOD\n");
    }
}
int main()
{
    PrimeTable();
    solve();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值