您的位置:首页 > 其它

poj 2635

2015-01-25 14:43 127 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: