zoukankan      html  css  js  c++  java
  • 阶乘分解 contest 数论基础——质数 T4

    Description

    给定一个整数N,把N!分解质因子,N!=∑pi^ci 其中(pi为质数,且p1<p2<p3...)。


    Input

    一个整数N。


    Output

    输出质因数 次数


    Hint

    1<=N<=10^6


    Solution

    N!中质因子的个数就等于1N每个数包含质因子p的个数之和。在1N中,至少包含一个p的有N/p个,而包含两个p的有N/p2个。但其中一个质因子的已经在N/p里面加过了,所以只需要在统计第二个因子,就是加N/p2而不*2。


    对于每个p时间复杂度是O(logN),总的时间复杂度是O(NlogN)。特别要注意的是,代码中comm需要long long,否则溢出后成了负数会死循环。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #define maxn 1000005
    #define inf 0x3f3f3f3f
    using namespace std;
    int primes[maxn],num[maxn],ans[maxn];
    int cnt,n;
    inline void OULA(){
    	for(int i=2;i<=maxn;i++){
    		if(!num[i])primes[++cnt]=i;
    		for(int j=1;i*primes[j]<=maxn;j++){
    			num[i*primes[j]]=true;
    			if(i%primes[j]==0)break;
    		}
    	}
    }
    inline void workk(){
    	for(int i=1;primes[i]<=n;i++){
    		int val=0,j=1;
    		long long comm=0;
    		while(true){
    			comm=pow(primes[i],j);
    			if(comm>n)break;
    			val+=n/comm;
    			j++;
    		}
    		ans[i]=val;
    	}
    }
    int main(){
    	scanf("%d",&n);
    	OULA();
    	workk();
    	for(int i=1;primes[i]<=n;i++){
    		if(ans[i]!=0){
    			printf("%d %d
    ",primes[i],ans[i]);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    递归 迷宫问题
    中缀表达式转后缀表达式
    栈实现后缀表达式计算

    单向环形链表
    站在巨人的肩上
    C#自宿主API,不依赖IIS
    MySQL 安装失败解决办法
    第一话
    村上春树《眠》读书笔记
  • 原文地址:https://www.cnblogs.com/virtual-north-Illya/p/10163749.html
Copyright © 2011-2022 走看看