数论只会GCD

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lv414333532/article/details/79934386

                                              数论只会GCD

                                        Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

为了庆祝 2017 年暑假集训的结束,Stone 决定发放一些奖品,但是奖品的数量有限, Stone 决定考一考你。
如果你能够告诉 Stone 正确答案,就可以找 bLue 领取奖品。
给你一个数 n(保证是 20170826 的倍数),问它有多少个素因子。

Input

输入一个正整数 n (n1018)

Output

输出一个数,表示答案。

Sample Input

20170826

Sample Output

4

Hint

Source

【2016级ACM暑假集训 结训赛(算法组)】Stone 


思路:题目给出的数据范围是1e18=10^18,假设出入的是n,并且知道20170826*X=n;20170826的质因数有四个(2 23 71 193,有兴趣可以打个表);

也就是 若干个2*若干个23*若干个71*若干个193   * X=n,那么X的范围是1e11,如果找出1e6以内的素数,n除尽(完全,注意使用while),如果不为1那么会有大于1e6的因子,假设他不为质数,那么X最小为1e12以上,大于1e11,所以可以得出,如果最后不为1,那么最后的那个数必然为n的质因子。


素数表的打印,不用会超时;























#include <cstdio>
#include <cstring>
#include <iostream>
#define LL   long long
using namespace std;
int prime[2000010];
bool flag[2000010];
int k=0;
void make_prime()
{
    memset(flag,0,sizeof(flag));

    for(int i=2; i<1e6+10; i++)
    {
        if(!flag[i])

        {
            prime[k++]=i;
        }
        for(int j=0; j<k&&prime[j]*i<1e6+10; j++)
        {
            flag[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }

    }

}
int main()
{
    LL ans;

    make_prime();
    //printf("%d\n",k);
    while(~scanf("%lld",&ans))
    {

        int cnt=0;
        for(LL i=0; i<k; i++)
        {
            if(ans%prime[i]==0)
            {
                cnt++;
                while(ans%prime[i]==0)
                    ans/=prime[i];
            }
        }
        if(ans>1)
            cnt++;
        printf("%d\n",cnt);
    }
}



猜你喜欢

转载自blog.csdn.net/lv414333532/article/details/79934386