思路:部落格:
考慮每個質因子對於整體答案的貢獻。
拿第二組樣例算一算就不難發現:第 pp 個位置上的數,其包含的任意乙個素因子,它原本應當產生的貢獻有 (n−p+1)⋅p(n−p+1)⋅p,
但是考慮到若其前面出現過一樣的素數,那麼應當減去一些重複計算的區間。假設它前面的和它一樣的素數,最後一次出現在 qq 位置,那麼就應當減去 (n−p+1)⋅q(n−p+1)⋅q,即 a[p]a[p] 包含的任意乙個質因子其產生的貢獻為 (n−p+1)⋅p−(n−p+1)⋅q=(n−p+1)⋅(p−q)(n−p+1)⋅p−(n−p+1)⋅q=(n−p+1)⋅(p−q)。
不妨用 pos[i][k]pos[i][k] 來儲存每個素因子的 「pp」,pos[i][k−1]pos[i][k−1] 儲存每個素因子的 「qq」。換句話說,pos[i][k]pos[i][k] 代表某個素因子 ii 在 a[1∼n]a[1∼n] 中第 kk 次「出現」的位置是 pos[i][k]pos[i][k];特別地,令 pos[i][0]=0pos[i][0]=0。那麼對於任意素因子 ii,它對答案的貢獻是 (n−pos[i][k]+1)⋅(pos[i][k]−pos[i][k−1])(n−pos[i][k]+1)⋅(pos[i][k]−pos[i][k−1])。
我們可以對 a[1∼n]a[1∼n] 分解質因數,然後更新相應的 pos[i][k]pos[i][k]。
code:
#include#include#include#includeusing namespace std;
typedef long long ll;
typedef pairpr;
const int max_s=1e6+5;
int n;
int prime[max_s];
int visit[max_s];
vectorive[max_s];
void find(int t,int x);
void prime_euler(int maxn);
int main()
int si;
ll res=0;
for(int i=1;i<=prime[0];++i)
cout<
return 0;
}void find(int t,int x)
} }if(x) ive[x].push_back(t);
}void prime_euler(int n)}}
2019ICPC南京站題解
a題大水題。1 include 2 define ll long long 3 define f i,a,b for int i a i b i 4 define scan i scanf d i 5 define pf printf 6using namespace std 78 intmain ...
2018 ACM ICPC 南京站小結
第一次打現場賽,又是在半主場,其實挺激動的,但是結果不盡人意 熱身賽 開幕式後的熱身賽就打得有些問題,四個題都不難,我們都想到了做法,但因為機時不夠 細節問題導致前兩個小時一直沒有過題,然後ac的三道題相距都在20分鐘內。比如我做的計數問題,學長已經幫我把o n 2 的求和優化到o n 了,但是因為...
2018 ACM ICPC 南京站小結
待更ing.2018 10 20待更到現在,今天補一下 上週結束的比賽,到現在還是很深刻 周五到了南京,出地鐵站進入校園,遇到很多穿藍色衣服的小哥哥小姐姐 還以為是迎接我們的志願者,後來才知道是他們的主題活動,可以乘坐 跟我們沒有關係 校園很大,食堂很多,也很好吃 上午報名,下午熱身賽,實在太累了所...