1. 程式人生 > >尤拉篩選+唯一分解(模板)

尤拉篩選+唯一分解(模板)

#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
typedef long long ll;

ll prime[MAXN];
ll vis[MAXN];
ll cnt;
ll n;
void isprime()
{
    cnt=0;
    for(int i=2;i<=MAXN;i++)
    {
        if(!vis[i])prime[cnt++]=i;
        for(int j=0;j<cnt && i*prime[j]<=MAXN;j++)
        {
            vis[i*prime[j]]=i;
            if(i%prime[j]==0)break;
        }
    }
}
ll solve()
{
    ll sum=n;
    ll ans=1;
    for(int i=0;i<cnt && prime[i]<sum;i++)
    {
        int k=0;
        while(sum%prime[i]==0)
        {
            sum/=prime[i];
            k++;
        }
        ans*=(1+k);
    }
    if(sum>1)ans*=(1+1);//多出一個素數來
    return ans;
}

                             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

2

10 2

12 2

Sample Output

Case 1: 1

Case 2: 2

題意:

給你一個長方形面積和一個最小可能的邊長,統計有多少種滿足面積相等且邊長大於等於最小邊長的長方形(一定不是正方形)。

根據唯一分解定理,先將a唯一分解,則a的所有正約數的個數為num = (1 + a1) * (1 + a2) *...(1 + ai),這裡的ai是素因子的指數,見唯一分解定理,因為題目說了不會存在c==d的情況,因此num要除2,去掉一半,然後列舉小於b的a的約數,拿num減掉就可以了

注意當b*b>n 直接不走不然會超時

#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
typedef long long ll;

ll prime[MAXN];
ll vis[MAXN];
ll cnt;
ll n;
void isprime()
{
    cnt=0;
    for(int i=2;i<=MAXN;i++)
    {
        if(!vis[i])prime[cnt++]=i;
        for(int j=0;j<cnt && i*prime[j]<=MAXN;j++)
        {
            vis[i*prime[j]]=i;
            if(i%prime[j]==0)break;
        }
    }
}
ll solve()
{
    ll sum=n;
    ll ans=1;
    for(int i=0;i<cnt && prime[i]<sum;i++)
    {
        int k=0;
        while(sum%prime[i]==0)
        {
            sum/=prime[i];
            k++;
        }
        ans*=(1+k);
    }
    if(sum>1)ans*=(1+1);//多出一個素數來
    return ans;
}
int main()
{
    int t;
    int CS=1;
    isprime();
    ll d;
    scanf("%d",&t);
    ll ans;
    while(t--)
    {
        ans=0;
        ll cnt=0;
        scanf("%lld%lld",&n,&d);
        if(d*d>n)
            ans=0;
        else
        {
            for(int i=1;i<d;i++)if(n%i==0)cnt++;
            ans=solve()/2-cnt;
        }

        
        printf("Case %d: %lld\n",CS++,ans);

    }

    return 0;
}

相關推薦

篩選+唯一分解(模板

#include<bits/stdc++.h> #define MAXN 1000005 using namespace std; typedef long long ll; ll prime[MAXN]; ll vis[MAXN]; ll cnt; ll n;

Codeforces 906D(降冪定理? + 唯一分解定理

莫名其妙的尤拉降冪定理,網上也找不到證明和解釋,只有這個部落格,但是神奇的可以ac,不知道快速冪為什麼寫成這個樣子,正常的快速冪還要wa,覺得很奇怪,真的是我太菜了。。。剛剛突然想明白了快速冪為什麼寫成這個樣子。。。剛才自己好傻還想了半天,寫成這個樣就是普通的快速冪,不過是符

無向圖求路徑,迴路 模板(Hierholzer 演算法

定義: 歐拉回路:每條邊恰好只走一次,並能回到出發點的路徑 尤拉路徑:經過每一條邊一次,但是不要求回到起始點 歐拉回路存在性的判定: 無向圖 每個頂點的度數都是偶數,則存在歐拉回路。 有向圖 每個節頂點的入度都等於出度,則存在歐拉回路。 尤拉路徑存在性的判定:

線性篩選素數(篩選

bool ok[maxn];//自然數表 int prime[maxn];//素數陣列 int tol;//素數長度 void make_prime() { tol = 0; for(int i

小於等於n的素數的個數(埃式篩選法和篩選

問題描述 給定數字n,求出小於等於n的素數的個數,假設n<=1000000 思路 找出數字n之前的所有素數,用陣列isprime[i]表示i是否是素數;用num[i]表示小於等於數字i的素數有多少。 那麼最重要的就是解決判斷一個數是否是素數 方法

LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理

void 都是 scanf esp for space tar sqrt lld http://lightoj.com/volume_showproblem.php?problem=1341 題意:給你矩形的面積(矩形的邊長都是正整數),讓你求最小的邊大於等於b的矩形的個

UVa 10375 - Choose and divide(唯一分解定理

ide clas 數組 AI AS lin buffered ring buffere 鏈接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p

pku1365 Prime Land (數論,合數分解模板

getchar() for bsp long 次數 spa main clu pre 題意:給你一個個數對a, b 表示ab這樣的每個數相乘的一個數n,求n-1的質數因子並且每個指數因子k所對應的次數 h. 先把合數分解模板乖乖放上: for (int i = 2; an

Fence Building(公式+盧卡斯

使用尤拉公式推導,平面內的區域個數=平面內的點數+平面內的邊數+2,因為這個是在圓上,所以圓外補集的那1個區域要減去, 1.所以最後+1而不是+2。 點數=C(n,4),即每4個點連線就有一個平面內的點產生 .邊數=C(n,2),即每兩個點連線就產生一條邊。 這題的範圍

UVA - 10791 分解質因數(唯一分解定理

參考https://www.cnblogs.com/scau20110726/archive/2013/01/18/2866101.html   題意(就是因為讀錯題意而wa了一次):給一個數字n,範圍在[1,2^23-1],這個n是一系列數字的最小公倍數,這一系列數字的個數

UVA - 10375(唯一分解定理

#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using nam

BZOJ4916 神犇和蒟蒻(函式+杜教篩

  第一問是來搞笑的。由尤拉函式的計算公式容易發現φ(i2)=iφ(i)。那麼可以發現φ(n2)*id(n)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 。這樣就有了杜教篩所要求的容易算字首和的兩個函式。一通套路即可。 #include<iostream> #include<c

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

四元數與角(RPY角的相互轉換

RPY角與Z-Y-X尤拉角   描述座標系{B}相對於參考座標系{A}的姿態有兩種方式。第一種是繞固定(參考)座標軸旋轉:假設開始兩個座標系重合,先將{B}繞{A}的X軸旋轉γγ,然後繞{A}的Y軸旋轉ββ,最後繞{A}的Z軸旋轉αα,就能旋轉到當前姿態。可以稱其為X-Y-Z fixed angles或

Mysterious Bacteria (唯一分解定律

Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange reproduction system. RC-01 lives exactly x day

圖論:(半圖與(半哈密頓圖

圖論:尤拉圖與哈密頓圖 圖論最基本的要素就是點和邊,尤拉圖和哈密頓圖是分別關於點和邊的兩種特殊圖的形式。 尤拉圖側重於經過所有的點,哈密頓圖側重於經過所有的邊。 尤拉圖 尤拉路徑:一條路徑在圖G中恰好經過每條邊一次。尤拉通路:通過圖中所有邊的簡單路(其實就是每條邊經過

hdu 5108 Alexandra and Prime Numbers(唯一分解定理

【唯一分解定理】 任意一個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,一個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。 公式:n = P1^a1 *

Prime Path-POJ3126-1篩選法+BFS-好題

題意: 給你兩個四位數的質數m,n(m<=n),每次變化只能改變當前數的一個數字,並且過程中的數字全是四位數的質數,求最小的步數。 思路: 先尤拉篩選法求出素數,然後從m開始BFS,每次只改變一個

Light oj 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 fi

2018.12.17【BZOJ4802】函式(Pollard-Rho

傳送門 解析: 對於 n = ∏