数论只会GCD

                                              数论只会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);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值