csust 最小素因子問題(樹狀陣列)

2021-09-12 12:30:32 字數 1383 閱讀 3382

題幹:

description

寒冰射手艾希新學會了乙個技能,艾希通過這個技能成為了一名聲名遠揚的神箭手,從此再也無人敢侵犯弗雷爾卓德!

這個技能的描述如下(假設英雄聯盟內的每個人都有乙個編號):

假設艾希有x-1(x>=2)x−1(x>=2)個敵人,每個敵人的編號分別為1\;\;1~\;\;x-1x−1,那麼艾希的編號就是xx。艾希每次使用這個技能,那麼對於某個敵人,如果這個敵人的編號的最小素因子小於等於艾希的編號的最小素因子,那麼艾希能對他造成致命一擊。

現在假設已知有tt場戰爭,每場戰爭有x-1x−1個敵人,艾希想知道她每場戰爭使用這個技能能對多少個敵人造成致命一擊,由於這個數目太大,她無法計算所以希望你編寫乙個程式來幫她計算這個結果。

乙個數xx的最小素因子:能夠整除xx的最小素數。比如2和4的最小素因子是2,3的最小素因子是3。我們知道1不是素數,但是為了題目的完整性,在這裡我們定義1的最小素因子為1。

input

乙個正整數t(t<=1000000)t(t<=1000000),表示有t組資料。

每組資料輸入乙個整數x(2<=x<=1000000)x(2<=x<=1000000),表示艾希的編號為xx,且敵人數量為x-1x−1。

output

對於每組資料輸出乙個整數ans,表示艾希在這場戰爭中使用該技能能對ans個敵人造成致命一擊。

sample input 1 

2

26

sample output 1

1

3

hint

對於6這個資料,我們知道1~6的每個數的最小素因子依次為1、2、3、2、5、2,因此編號為1、2、4的敵人將會受到致命一擊。

解題報告:

注意到需要用到單點更新和區間查詢,樹狀陣列離線處理答案就可以了。

ac**:

#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pb push_back

#define pm make_pair

using namespace std;

const int max = 1000000 + 5;

int d[max];//處理出每個數字的最小素因子

int c[max];

int ans[max];

int lowbit(int x)

void update(int x,int val)

}int query(int x)

return res;

}void db()

return 0 ;

}

求乙個數的最小素因子外加快速分解質因子

這種方法使用與資料小於1e7,這種適用於分解1到n所有數的質因子,而且列印出來是從小到大排好序的 首先找到每個數的最小質因子,不停的除以最小素因子,只到x 1 如果是分解單個還是根號n複雜度的更好一點 include bits stdc h using namespace std typedef u...

N 分解素因子及若干問題

將n!表示成 n p1 t1 p2 t2 pi ti pk tk 其中p1,p2 pk是素數,1顯然很容易通過素數篩選求出pi,因為1我們先來看一下對於2這個素因子,把n!分成兩部分,即奇偶兩部分 假設n是偶數 n!1 2 3 4 5 n 2 4 6 1 3 5 因為有n 2個偶數,所以偶數部分可以...

判斷乙個數的素因子個數

有感而發 就寫一下 doge 這裡手動 solemntee include using namespace std typedef long long ll intmain ans if n 1 ans 如果是個素數 n就不會被除到1 cout 輸出乙個非素數的所有素因子 個數 include us...