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(m2∗log(n))
注意:
n最大為400000,中間過程有n*(n+1),如果用
int 會超出範圍,所以要用longlong ,不然會WA。
#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不互質的數可以用容斥原理來實現,再用公式求和來進行更
(hdu4407)Sum(容斥原理)
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