zoukankan      html  css  js  c++  java
  • poj 2635 高精度取模

    给出一个大整数10^100 KEY,这个数是两个素数的积,然后给出一个数L,如果KEY存在小于L的素数,则返回false,并输出这个最小的素数,如果大于等于L,则输出true。

    由于L并不是很大,我们先将素数表打出来,利用大整数取模运算来计算是否存在小于L的素数,由于KEY比较大,我们先转化成大进制数加快运算

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    const int N=101;
    const int MAXN=1000010;
    char str[N];
    bool isPrim[MAXN];
    int key[N],L,prime[MAXN],data[N];

    //打表
    void initPrime()
    {
        int i,k;
        memset(isPrim,0,sizeof(isPrim));
        isPrim[0]=0;
        isPrim[1]=0;
        k=0;
        for(i=2;i<MAXN;i++)
        {
            if(!isPrim[i])
            {
                prime[k++]=i;
                int j=2;
                while(i*j<MAXN)
                {
                    isPrim[i*j]=1;
                    j++;   
                }
            }
        }
    }

    //转化为大进zhi数
    int converse(char *a,int len)
    {
        int i,j,l,k;
        if(0 == len%3)
            l=len/3;
        else
            l=len/3+1;
        k=l;
        int tmp=1;
        for(j=len-1;j>=0;j-=3)
        {
            l--;
            data[l]=0;
            tmp=1;
           
            for(i=j;i>=(j-2) && i>=0;i--)
            {
                data[l]+=(a[i]-'0')*tmp;
                tmp*=10;
            }
        }
        return k;
    }

    //同余取模
    bool div(int *a,int t,int len)
    {
        int result=0;
        for(int i=0;i<len;i++)
        {
            result=(result*1000+a[i])%t;
        }
        if(result)
            return false;
        return true;
    }
    int main()
    {
        int j,len;
        initPrime();
        while(1)
        {
            memset(str,'\0',sizeof(str));
            scanf("%s%d",str,&L);
            if(0 == L)
                break;
            len=strlen(str);
            len=converse(str,len);
            bool flag=true;
            for(j=0;prime[j]<L;j++)
            {
                if(div(data,prime[j],len))
                {
                    flag=false;
                    break;
                }
            }
            if(!flag)
                printf("BAD %d\n",prime[j]);
            else
                printf("GOOD\n");
        }
        return 0;
    }

  • 相关阅读:
    luogu P1330 封锁阳光大学 x
    luoguP3353 在你窗外闪耀的星星
    luogu小金明qwq x
    [HDOJ5093] Battle ships(最大匹配)
    [HDOJ5092] Seam Carving(DP,记录路径)
    [UVA1449] Dominating Patterns(AC自动机,STL,计数,神坑)
    [POJ3057]Evacuation(二分图匹配,BFS,二分,好题)
    [POJ3041]Asteroids(二分图,最大匹配)
    [POJ2195]Going Home(带权最大匹配,KM,最小费用流)
    [codeVS1917] 深海机器人问题(费用流,拆边)
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2166488.html
Copyright © 2011-2022 走看看