1. 程式人生 > >hdu 4407 SUM(容斥原理)

hdu 4407 SUM(容斥原理)

題意:

有一個元素為 1~n 的數列An,有2種操作(最多1000次):
1. 求某段區間 [a,b] 中與 p 互質的數的和。
2. 將數列中某個位置元素的值改變。

解析:

剛剛開始的時候想成線段樹了,看了題解才明白是用容斥原理來做。
對於操作1,解的性質滿足區間減法,則我們只需要考慮如何求 [1,n] 中與 p 互質的數的和即可。
由於與 p 互質的數的和不太好求,於是可以通過先求出與 p 不互質的數的和。
若一個數 x 若與 p 不互質,當且僅當兩者素因子的集合有交集。
根據這個定理,可以先預處理出每個數的質因子,然後利用利用容斥原理求出,到當前終止位置,有多少數字和 p

不互質。
又由於滿足區間減法,所以可以求出有區間內有多少數字和 p 不互質。那麼區間內的和減去區間內和 p 不互質的數的和就是最終答案。

對於操作2,修改用map記錄,每次掃一遍即可,如果原數和c互質就減掉,修改完的數和c互質就加上去,總複雜度O(m2log(n))

注意:

n最大為400000,中間過程有n*(n+1),如果用int會超出範圍,所以要用longlong,不然會WA。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map> #define pb push_back using namespace std; typedef long long ll; const int N = (int)4e5 + 5; map<int, int> mp; map<int, int>::iterator it; vector<int> prime[N]; int n, m; int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a%b); } void getFactor() { for
(int i = 2; i < N; i++) { if(prime[i].size() > 0) continue; for(int j = i; j < N; j += i) { prime[j].pb(i); } } } ll cal(int r, int num) { int size = prime[num].size(); ll ret = 0; for(int i = 1; i < (1<<size); i++) { int cnt = 0; ll d = 1; for(int j = 0; j < prime[num].size(); j++) { if((i >> j) & 1) { d *= prime[num][j]; cnt++; } } ll n = r / d; if(cnt & 1) ret += n * (n + 1) / 2 * d; else ret -= n * (n + 1) / 2 * d; } return ret; } ll query(int ql, int qr, int val) { ll n = (qr - ql + 1); ll sum = n * ql + n * (n - 1) / 2; sum -= (cal(qr, val) - cal(ql - 1, val)); for(it = mp.begin(); it != mp.end(); it++) { if(ql <= it->first && it->first <= qr) { if(gcd(val, it->second) == 1) sum += it->second; if(gcd(val, it->first) == 1) sum -= it->first; } } return sum; } int main() { getFactor(); int op, x, y, val; int T; scanf("%d", &T); while(T--) { mp.clear(); scanf("%d%d", &n, &m); while(m--) { scanf("%d", &op); if(op == 1) { scanf("%d%d%d", &x, &y, &val); ll ans = query(x, y, val); printf("%lld\n", ans); }else { scanf("%d%d", &x, &val); mp[x] = val; } } } return 0; }

相關推薦

hdu 4407 SUM原理

題意: 有一個元素為 1~n 的數列An,有2種操作(最多1000次): 1. 求某段區間 [a,b] 中與 p 互質的數的和。 2. 將數列中某個位置元素的值改變。 解析:

HDU 4407 Sum原理+質因數分解

題意: 給一個長度為n的序列,序列由1~n依次組成。 對序列執行兩種操作: 1.查詢[x,y]內與p互素的數的和; 2.修改第x數為c. 思路: 往線段樹的方向想了半天,發現就是容斥原理略微變形,腦殘不可醫啊。。 修改操作可以用map進

hdu 4407 Sum原理+數論

首先求出1~N之內與P互質的數的和,然後儲存每次改變的操作。如遇到詢問,dfs搜尋一下更新ans值即可。 在求1~N之內與P互質的數的和的時候,反著先求與P不互質的數的和,再用總和減去要方便很多。而求與P不互質的數可以用容斥原理來實現,再用公式求和來進行更

hdu4407Sum原理

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3639 Accepted Submissi

GCD HDU - 1695原理

stdin false print ont 分享 typedef vector swa sed 要求從滿足gcd(x, y) = k的對數,其中x屬於[1, n], y屬於[1, m] gcd(x, y) = k ==>gcd(x/k, y/k) =1 x/k

HDU-1796 How many integers can you find原理

                            How many integers can you find      

HDU 1695 GCD定理

font hint cup show lan orm required stdio.h test case GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/

#19. 計數原理

cnblogs += void lld ring 輸入輸出 計數 define printf 時間限制:1s 內存限制:256MB 【問題描述】 給出m個數a[1],a[2],…,a[m] 求1~n中有多少數不是a[1],a[2],…,a

『ZOJ 3547』The Boss on Mars 原理

ostream idt employee ant mars pri mes because reason 傳送門戳這裏qwq 題目描述 On Mars, there is a huge company called ACM (A huge Company on M

Newcoder 39 E.集合中的質數原理

Description 給出一個集合和一個數 m m m。 集合裡面有

【ZOJ - 2836 】Number Puzzle 原理

題幹: Given a list of integers (A1, A2, ..., An), and a positive integer M, please find the number of positive integers that are not greater than M

【HDOJ5514】Frogs原理

題意:n個青蛙在一個有m個節點的圓上跳,m個節點的標號為0-m-1,每隻青蛙每次跳的節點數給出,讓求n只青蛙所跳位置標號之和 n<=1e4,m<=1e9,a[i]<=1e9 思路:由裴蜀定理可知該問題等價於[0,m-1]能被至少一個gcd(m,a[i])整除的數字之和 因為n過大,考慮

hdu4135 Co-prime原理

題意:給定一個左端點L,右端點R,問L-R間有多少個數與N互質,注意1與任何數均互質。 題解:容斥原理,對N分解質因數,然後容斥原理找出這些質因數的倍數的個數,即與N不互質的數, 分別統計1-R中不互質,1-(L-1)中不互質,二者作差即為L-R中不互質,再用區間長度

Number Puzzle原理

Given a list of integers (A1, A2, …, An), and a positive integer M, please find the number of positive integers that are not greate

ZOJ 2836 - Number Puzzle原理

Given a list of integers (A1, A2, …, An), and a positive integer M, please find the number of positive integers that are not greater than M and di

BZOJ5019 SNOI2017遺忘的答案原理

  顯然存在方案的數一定是L的因數,考慮對其因子預處理答案,O(1)回答。   考慮每個質因子,設其在g中有x個,l中有y個,則要求所有選中的數該質因子個數都在[x,y]中,且存在數的質因子個數為x、y。對於後一個限制,顯然可以簡單地容斥,即[x,y]-[x+1,y]-[x,y-1]+[x+1,y-1],列

1e9個兵臨城下原理

連結:https://ac.nowcoder.com/acm/contest/321/A 來源:牛客網   時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 題目描述  “F

hihoCoder #1646 : Rikka with String II原理

題意 給你 \(n\) 個 \(01\) 串 \(S\) ,其中有些位置可能為 \(?\) 表示能任意填 \(0/1\) 。問對於所有填法,把所有串插入到 \(Trie\) 的節點數之和(空串看做根節點)。 \(n \le 20, 1 \le |S_i| \le 50\) 題解 直接算顯然不太好算的。

hdu2841原理

There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how many tre

HDOJ 4135 Co-prime原理

Co-prime Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su