Aladdin and the Flying Carpet LightOJ - 1341(合數)唯一分解定理

題目鏈接

題目大意:有一個數a,求有多少組(n1,n2)n1*n2=a 且n1>=b&&n2>=b;

(n1,n2) (n2,n1)算一種;

思路:直接求[b,√a)有多少滿足條件的數肯定是不行的。

唯一分解定理:

對於一個大於1正整數n可以分解質因數
 
則n的正約數的個數就是
  
其中a1、a2、a3…ak是p1、p2、p3,…pk的指數。

因爲a不可能出現(x,x)這組數,所以也f(n)/ 2  即爲 答案

又因爲pi都爲素數,所以可以打一個素數表來優化時間


代碼:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
long long  a,b;
const int maxn=1000047;
long long  cnt=1;
int prim[maxn],p[maxn];  
int k = 0;  
void find_prim()  
{
    k = 0;  
    for(int  i = 2; i < maxn; i++)  
    {  
        if(!p[i])  
        {  
            prim[k++] = i;  
            for(int  j = i+i; j < maxn; j+=i)  
            {  
                p[j] = 1;  
            }  
        }  
    }  
} 
void get(){
	cnt=1;
	int j=0;
	for(int i=0;prim[i]<=a/prim[i];i++){ //prim[i]<a&&i<k用這個的話耗時比較大
		if(a%prim[i]==0){
			j=0;
			while(a%prim[i]==0){
				a/=prim[i];
				j++;
			}
			cnt*=(j+1);
		} 
	}
	if(a>1) cnt*=2;
	cnt/=2;
}
int main()
{
	find_prim();
	
	int t;
	scanf("%d",&t);
	for(int k=1;k<=t;k++){
		scanf("%lld%lld",&a,&b);
		long long c=a;
		if(b*b>=a) {
			cnt=0;
		}
		else {
			get();
			for(int i=1;i<b;i++){
				if(c%i==0) cnt--;
			}
		}
		printf("Case %d: %lld\n",k,cnt);
	} 
	return 0;
 } 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章