light_oj 1347 算术基本定理

light_oj 1347 算术基本定理

C - Aladdin and the Flying Carpet

Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Submit Status Practice LightOJ 1341

Description

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: ab(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

2

10 2

12 2

Sample Output

Case 1: 1

Case 2: 2

题意:给定面积a和最小边长b,求面积为a且宽大于等于b的长方形个数。

思路:显然,直接暴力的话,从b到sqrt(a)枚举a的约数,复杂度o(sqrt(n))*4000组数据,即10^6*4000,超时。

因此此题需要用到以下数论知识:

    算术基本定理:

      分解素因数:n=(p1^k1)*(p2^k2)*...*(pn*kn).(分解方式唯一)

      n的约数个数为cnt(n)=(1+k1)*(1+k2)*...*(1+kn).

本题先求出a的约数个数cnt(a),再暴力枚举出[1,b)中a的约数c,cnt/2-c即为答案。

然而b是10^12,此时注意到b>sqrt(a)时,不再存在符合条件的长和宽,此处剪枝。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<math.h>
#include<cctype>

using namespace std;

typedef long long ll;
const int maxn=1000100;
const int INF=(1<<29);
const double EPS=0.0000000001;
const double Pi=acos(-1.0);

ll a,b;
bool isprime[maxn];
vector<int> prime;

void play_prime()
{
    memset(isprime,1,sizeof(isprime));
    isprime[1]=0;
    for(int i=2;i<maxn;i++){
        if(!isprime[i]) continue;
        for(int j=i+i;j<maxn;j+=i){
            if(isprime[j]) isprime[j]=0;
        }
    }
    for(int i=2;i<maxn;i++)
        if(isprime[i]) prime.push_back(i);
}

int main()
{
    int casen=1;
    int T;cin>>T;
    play_prime();
    while(T--){
        //cin>>a>>b;
        scanf("%lld%lld",&a,&b);
        ll ans=0;
        ll t=a;
        ll cnt=1;
        for(ll i=0;prime[i]<=t&&i<prime.size();i++){
            int k=0;
            while(t%prime[i]==0){
                t/=prime[i];
                k++;
            }
            cnt*=(1+k);
        }
        if(t>1) cnt*=(1+1);
        ll cnt2=0;
        if(b*b>a) ans=0;
        else{
            for(int i=1;i<b;i++){
                if(a%i==0) cnt2++;
            }
            ans=cnt/2-cnt2;
        }
        //cout<<"Case "<<casen++<<": "<<ans<<endl;
        printf("Case %d: %lld\n",casen++,ans);
    }
    return 0;
}

时间: 2024-12-13 11:29:21

light_oj 1347 算术基本定理的相关文章

唯一分解定理(算术基本定理)及应用

算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (其中p1.p2.... pn为N的因子,a1.a2.... .an分别为因子的指数) 这样的分解称为 N 的标准分解式 应用: (1)一个大于1的正整数N,如果它的标准分解式为: N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (2)N的因子个数     M(N)= (1 + a1)*(1

NEFU119 组合素数【算术基本定理】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=119 题目大意: 给你两个整数N和P,求出C(2*N,N)被素数p整数的次数. 思路: 由算术基本定理的性质(5)可得到N!被素数P整除的次数. 来看这道题,C(2*N,N) = (2*N)! / (N! * N!).最终结果就是从(2*N)!能被素数P整除的 次数里边减去N!能被素数整除的次数*2.最终结果为: [2*N/P] + [2*N/P^2] + -

NEFU118 n!后面有多少个0【算术基本定理】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=118 题目大意: 问:计算N!末尾0的个数.(1 <= N <= 1000000000). 思路: N是100000000规模的数,直接计算结果,再统计0的个数显然不科学.将末尾0分解为2*5. 每一个0必然和一个因子5对应,但是一个数的因式分解中一个因子5不一定对应一个0.因为 还需要一个因子2,才能实现一一对应. 对于N!,在因式分解中,因子2的个数明显

算术基本定理

算术基本定理 算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式.例如:,. 算术基本定理的内容由两部分构成: 分解的存在性: 分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的. 算术基本定理是初等数论中一个基本的定理,也是许多其他定理的逻辑支撑点和出发点. 应用 (1)一个大于1的正整数N,如果它的标准分解式为: 那么它的正因数个数为 (2) 它的全体正因数之和为 当  时就称N为完全数. 是否

算术基本定理 求一个数的约数个数

算术基本定理  求一个数的约数个数 算术基本定理: 分解素因数:n=(p1^k1)*(p2^k2)*...*(pn*kn).(分解方式唯一) n的约数个数为cnt(n)=(1+k1)*(1+k2)*...*(1+kn). bool isprime[maxn]; vector<int> prime; void play_prime() { memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(int i=2;i<maxn;i++){ if

51nod 1189 算术基本定理/组合数学

www.51nod.com/onlineJudge/questionCode.html#!problemId=1189 1189 阶乘分数 题目来源: Spoj 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 1/N! = 1/X + 1/Y(0<x<=y),给出N,求满足条件的整数解的数量.例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4.由于数量可能很大,输出Mod 10^9 + 7. Input 输入一个数N

poj 1845 Sumdiv (算术基本定理求一个数因子和)

求一个数的所有因子和可以用算术基本定理,下面是它的两个重要应用: (1)一个大于1的正整数N,如果它的标准分解式为: N=(P1^a1)*(P2^a2)......(Pn^an) 那么它的正因数个数为(1+a1)(1+a2).....(1+an). (2) 它的全体正因数之和为d(N)=(1+p1+...p1^an)(1+p2+...p2^a2)...(1+pn+...+pn^an) 和求一个数正因数个数的方法类似. 可以先打表出sqrt(n)以内的所有素数(当然也可以不打表),因为n的素因数中

HDU 1142 Factorial ( 算术基本定理 + 分解N! )

HDU 1142 Factorial ( 算术基本定理 + 分解N! ) #include <cstdio> int main() { int t, n; scanf( "%d", &t ); while( t-- ) { scanf( "%d", &n ); int cnt = 0; while( n ) { cnt += n/5; n /= 5; } printf( "%d\n", cnt ); } return

数论-算术基本定理

算术基本定理又叫唯一因子分解定理,算术基本定理的表述如下: 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 ,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数.这样的分解称为 N 的标准分解式. 在进行证明这个定理之前,先说一个关于素数整除性的一个基本而重要的事实. 欧几里得引理:对所有的素数p和所有整数a,b,如果p|ab,则p|a,或p|b.即:如果一个素数整除两个正整数的乘积,那么这个素数可以至少整除这两个正整数中的一个.如果