阿汤的疑惑(大数取余+质因数分解)

链接:https://www.nowcoder.com/acm/contest/122/F

阿汤同学最近刚学数论,他发现数论实在是太有趣了,于是他想让你也感受一下数论的乐趣。现在他给你一个正整数 N 和一个正整数 M,要求你用 N 对 M 进行取余操作,即 N % M,记余数为 S。
但是他发现这样好像并不能让你感受到数论的乐趣,于是他想让你在N 对 M 取余操作的基础上再求出这个余数 S 能分解出多少个不同质因数。

质因数:质因数在数论里是指能整除给定正整数的质数,质数就是只能整除 1 和本身的数,定义 2 是最小的质数。

真的不错这道题;

考查了两个方面的知识:1、一个是用大数取余,(紫书上有写)

for(    int     i   =  0    ;    i<len    ;    i++) {

            ans=(int)(    (long long )    ans*10+n[i]-'0'    );

}printf("%d\n",ans);

贴上 代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000400;
int prime[maxn],x[maxn],cnt;
void is_prime(){
    int t=0;
    for(int i=2;i<=maxn;i++){
        if(x[i]==0){
            prime[t++]=i;
            x[i]=1;
            for(int j=i;j<=maxn;j+=i){
                x[j]=2;
            }
        }
    }
    cnt=t;
}
int main()
{

    is_prime();
    char n[1000];
    int m,T;
    while(~scanf("%d",&T)){
        while(T--){
        scanf("%s",n);
        scanf("%d",&m);
        int len=strlen(n);
        ll ans=0;
        for(int i=0;i<len;i++){
            ans=(int)(((ll)ans*10+n[i]-'0')%m);
        }
        int k=ans,tot=0,a[maxn],b[maxn];
        //printf("%d\n",k);
        for(int i=0;prime[i]*prime[i]<=k&&i<cnt;i++){
            if(k%prime[i]==0){
                a[++tot]=prime[i];
                b[tot]=0;
                while(k%prime[i]==0){
                    ++b[tot];
                    k/=prime[i];
                }
            }
        }

            if(k!=1){
                a[++tot]=k;
                b[tot]=1;
            }
            printf("%d\n",tot);
        }
    }
    return 0;
}

阅读更多
换一批

没有更多推荐了,返回首页