完全沒有頭緒
聽完隊友講的我還是楞了好半天菜慢慢理解.我好菜啊
首先要弄懂題目的意思,轉換一下題意就是求每個素因子出現區間的次數.區間長度最短為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...