版权声明:本文为博主原创文章,未经博主允许不得转载。 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 (n⩽1018)。
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);
}
}