2020牛客多校第7場訓練賽H Dividing

2022-08-22 09:27:09 字數 1345 閱讀 7022

題意: 對於legend tuple(下文稱為lt)有以下3種規則:

1、(1,k)必然符合要求;

2、如果(n,k)符合要求,則(n+k,k)也符合要求;

3、如果(n,k)符合要求,則(n*k,k)也符合要求。

給出n、k,分別為n、k的範圍,問有多少符合要求的lt。

思路:我們可以先看一下n==3,k==3時。

k=1:(1,1),(2,1),(3,1);

k=2: (1,2),(3,2),(2,2);

k=3:   (1,   3),(3, 3)  共8種。

我們一開始都是把n固定為1,而k取[1,k]中的乙個值,然後用第2、3規則取「擴散」出去找到別的。

這裡我們就很明顯是個bfs的思想了,但這題必不可能是bfs,不過不妨礙我們先打個表來看看。

//此處果斷喊來隊伍的工具人

#include

using namespace std;

#define ll long long

int n,k,ans=0;

bool vis[10005];

void bfs(int x)

if(x2<=n&&!vis[x2])

q.pop();}}

int main()

cout得表:

第21行是用第20行做的差。

當k>n時,對於任意的(1,i)/*i>n*/對於答案的貢獻只有1。

當k<=n時,(1,i)/*i==n*/對於答案的貢獻為2.

當ki<=2,ans+=n;

2這裡有個重點,也是這題為什麼迴圈能ac的原因。我們不難看出在[3,n]這個區間上,有很多連續的區間,在這些區間上n/i是相同的。那麼我們就可以跳著去累加,而不需要乙個乙個去看。

**如下:

#includeusing

namespace

std;

#define ll long longll mod=1e9+7

;int

main()

ll ans=0

;

if(k>=n)

bool f=true

;

for(ll i=1; i<=k&&f; i++)

if(y*x==n)y--;

ans=(ans+ ((y-i+1)*x*2)%mod +(y-i+1)%mod )%mod;

i=y;}}

}cout

}return0;

}

2020牛客多校第五場H

乙個數轉為二進位制後,最多有log位,所以減小後的個數最多只有log位,加上二分,複雜度為平方級的,主席樹也是log級的,所以總複雜度為 nlog2n mlogn 可能常數偏大 ac include include include include include include include de...

2020牛客多校訓練賽(第二場)補題

比賽入口 題意 有乙個multiset s,一共有三種操作 1.s插入乙個x 2.s刪除乙個x 3.查詢s中是否存在兩個數字,使得這兩個數字能和x組成乙個非退化三角形 思路 顯然,s是有序的,且判斷x是否能和s中兩個數字組成非退化三角形,一共有以下三種情況 1.x是最大邊,判斷 x的最後兩個字 2....

2020牛客多校第七場H

題目鏈結 任何 1,k 是有效答案。如果 n,k 是有效答案,那麼 n k,k 和 n k,k 都是有效答案。給出t組,n和k 範圍1 1e12 求出 n,k 在n n,k k範圍內的有效個數。在k不變的情況下,n的取值範圍只可能是k的倍數,或者k的倍數 1,可以o 1 算出當前k對應的答案個數。即...