因子个数与因子和

题目:LightOJ:1341 - Aladdin and the Flying Carpet(因子个数)

It‘s said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summons a powerful Genie. Here we are concerned about the first mystery.

Aladdin was about to enter to a magical cave, led by the evil sorcerer who disguised himself as Aladdin‘s uncle, found a strange magical flying carpet at the entrance. There were some strange creatures guarding the entrance of the cave. Aladdin could run, but he knew that there was a high chance of getting caught. So, he decided to use the magical flying carpet. The carpet was rectangular shaped, but not square shaped. Aladdin took the carpet and with the help of it he passed the entrance.

Now you are given the area of the carpet and the length of the minimum possible side of the carpet, your task is to find how many types of carpets are possible. For example, the area of the carpet 12, and the minimum possible side of the carpet is 2, then there can be two types of carpets and their sides are: {2, 6} and {3, 4}.

Input

Input starts with an integer T (≤ 4000), denoting the number of test cases.

Each case starts with a line containing two integers: a b (1 ≤ b ≤ a ≤ 1012) where a denotes the area of the carpet and b denotes the minimum possible side of the carpet.

Output

For each case, print the case number and the number of possible carpets.

Sample Input

Output for Sample Input


2

10 2

12 2


Case 1: 1

Case 2: 2

题意:

  根据唯一分解定理,先将a唯一分解,得a的所有正约数的个数为sum ,  因为题目说了不会存在c==d的情况,因此sum要除2 去掉重复情况,  然后枚举小于b的a的约数,拿sum减掉就可以了

数论原理:

  正整数n有素因子分解n=p1^a1*p2^a2*p3^a3*···*pn^an
  因子个数=(a1+1)(a2+2)(a3+3) ···(an+n)

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int prime[maxn]={1,1,0};
int prime1[maxn];
int sum,num,cnt;
long long a,b,temp;
void db()    //埃式筛
{
    cnt=0;
    for(int i=2;i<=sqrt(maxn);i++)
    {
        if(!prime[i])
        {
            for(int j=i+i;j<=maxn;j+=i)
            {
                prime[j]=1;
            }
        }
    }
    for(int i=2;i<=maxn;i++)
    {
        if(!prime[i])
        {
            prime1[cnt++]=i;
        }
    }
}
void reslove()  求所有素因子
{
    for(int j=0;j<cnt&&prime1[j]<=sqrt(temp);j++)
    {
        int num=0;
        if(temp%prime1[j]==0)
        {
            while(temp%prime1[j]==0)
            {
                num++;
                temp/=prime1[j];
            }
            sum*=(num+1);
        }
    }
    if(temp>1)    //如果temp不能被整分,说明还有一个素数是它的约数,此时num=1
    sum*=2;
}
int main()
{
    db();
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>a>>b;
        if(a<b*b)
        printf("Case %d: 0\n", i);
        else
        {
            sum=1;
            temp=a;
            reslove();
            sum/=2;
            for(int k=1;k<b;k++)
            {
                if(a%k==0)
                {
                    sum--;
                }
            }
             printf("Case %d: %d\n",i,sum);
        }
    }
    return 0;
} 


原文地址:https://www.cnblogs.com/BYBL/p/10969698.html

时间: 2024-08-29 22:37:01

因子个数与因子和的相关文章

求因子个数和因子和

//求因子个数 int Facnt(int n) { int res = 1; for(int i=2;i*i<=n;i++) { if(n%i == 0) { int cnt = 0; do { n /= i; cnt++; }while(n%i==0); res *= (cnt+1); } } if(n > 1) res = 2*res; return res; } //求因子和 int Facsum(int n) { int res = 1; for(int i=2;i*i<=n;

Divisors_组合数因子个数

Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation? Input The input consists of several instances. Each instance consists of a single li

HDOJ(HDU) 2521 反素数(因子个数~)

Problem Description 反素数就是满足对于任意i(0< i < x),都有g(i) < g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大. Input 第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b]. Output 输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数. Sample Input 3 2 3

POJ 2992 求组合数的因子个数

求C(n,k)的因子个数 C(n,k) = (n*(n-1)*...*(n-k+1))/(1*2*...*k) = p1^k1 * p2^k2 * ... * pt^kt 这里只要计算出分子中素数因子个数减去分母中的个数 然后每一种因子都有 (cnt+1)种取的可能,乘一下就出来了 但是不能逐个因子分解,试了两次都错了,后来初始的时候,先将这432个数提前预处理分解好保存到vector中 然后用的时候直接提取就行 不然会因为数据量太大超时的 1 #include <iostream> 2 #i

Acdream1084 寒假安排 求n!中v因子个数

题目链接:点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStatistic Next Problem Problem Description 寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行. 假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫

POJ 2992 Divisors 求组合数因子个数

题目来源:POJ 2992 Divisors 题意:... 思路:素数分解的唯一性 一个数可以被分解成若干素数相乘 p1^x1*p2^x2*...*pn^xn 根据乘法原理 因子数为 (x1+1)*(x2+1)*...*(xn+1) 不能直接求出组合数 会溢出 也不能把每个乘的数分解因子 这样会超时 C(N,M)=N!/(M!*(N-M)!) 另dp[i][j] 代表为i的阶乘中j因子的个数(j是素数) 那么i素数的个数为dp[n][i]-dp[m][i]-dp[n-m][i] 最后for循环从

求一个数的因子个数

首先对要求的数进行质因数分解,然后求各因数的幂的积数,比如600 = 2^3 * 3^1 * 5^2 那么因子个数是(3+1)*(1+1)*(2+1) = 24 public class TestYuman{ public static void main(String[] args){ int res=get_factor(6); System.out.println(res); } public static int get_factor(int input) { int factor=1,

Easy Number Challenge(暴力,求因子个数)

Easy Number Challenge Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 236B Appoint description:  System Crawler  (2016-04-26) Description Let's denote d(n) as the number of divisors of a

质因子个数

// 质因子个数int num[MAXN]; inline void init(){    num[1] = 0;    for (int i = 2; i < MAXN; ++i)    {        if (!num[i])        {            num[i] = 1;            for (int j = i + i; j < MAXN; j += i)            {                int temp = j;