2018南京區域賽 J Prime Game

2021-09-28 11:05:02 字數 1554 閱讀 6521

完全沒有頭緒

聽完隊友講的我還是楞了好半天菜慢慢理解.我好菜啊

首先要弄懂題目的意思,轉換一下題意就是求每個素因子出現區間的次數.區間長度最短為1.我們分析,第乙個數的因子會影響1* n個區間(暫時不考慮重複),第二個數的因子會影響2 * (n-1)個區間,以此類推.因此我們只需要分解每乙個數然後加上影響的區間即可.

我們從前往後處理.

可是很容易重複,問題就在於我們如何處理重複的因子.對於位置i

ii的因子x

xx,假設在位置j

jj已經出現過,那麼對於[j,

i−1]

[j,i-1]

[j,i−1

]的區間是沒有影響的,可是對於以[1,

j]

[1,j]

[1,j

]開頭的區間和以[i,

n]

[i,n]

[i,n

]結尾的區間這個因子就會重複計數,因此為了消去重複,我們給答案減去j∗(

n−i+

1)

j*(n-i+1)

j∗(n−i

+1),即會影響區間的個數.對於後面再出現因子x

xx的時候,因為j

jj對後面的影響已經消去,我們只需要考慮i

ii對後面的影響,所以同樣進行操作就可以,因此我們記住因子最後出現的位置然後計算即可.

需要注意分解質因數的時候只需要處理到這個數字的開方就可以,如果這個時候這個數還不為1就說明剩下的一定是乙個質數就不要進行處理了,否則會超時.

記得開long long ,而且要注意中間會爆long long ,所以在更新ans的時候要小心.

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const

int maxn=

1e6+5;

const

int maxm=

1e6+5;

int check[maxm]

;int prime[maxm]

;int vis[maxm]

;int tot=0;

int n,x;

ll ans;

void

creat_prime()

}}void

deal

(int x,

int idx)

while

(x%prime[i]==0

)}if(x==1)

break;}

if(x>1)

}}intmain()

printf

("%lld\n"

,ans)

;return0;

}

2018南京區域資格賽C GDY

原題傳送門 題意 簡單的撲克牌遊戲,先定義撲克牌的大小如下 然後從第乙個開始出最小的牌,然後其餘玩家接著出牌,誰先沒有手牌誰就獲勝,並輸出其餘人的手牌點數和 出牌規則 一開局從第一位玩家開始每人抽取 張牌,保證第一位玩家回合開始前每人手牌數不低於 張 玩家 出了一張 的話,從玩家 開始,所有人按順序...

2023年ACMICPC亞洲區域賽南京賽區總結

首先我認為我們可以 a 題 a題因為題意讀錯,導致wa了一發 j題我不會寫,但是小飛想出來了怎麼寫,但是我沒聽懂,但我相信他,他去寫了1a。i題全場最崩的一題,首先我抄了個網路流的板子,但是樣例都沒過,小飛開始寫dinic,後來樣例過了,但是交上去wa了,從此這道題就開始改。知道最後二十分鐘發現題意...

2018 icpc 南京網路賽

題目 鏈結 a.an olympian math problem 輸出n 1即可 女朋友猜的 includeusing namespace std define ll long long ll fac 103 int main for int i 1 i m i ll ans 0 for int i...