P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ「n/i」(i=1~n),「」表示向下取整 由于「n/i」在某段区间内都有相同的值,所以可以分块算,复杂度O( sqrt(n) ) code: ll res=; ,r;l<=n;l=r+){ r=n/(n/l): res=res+(r-l+)*(n/l);}return res; 当mod是素数时,…
一.题目 P2260 [清华集训2012]模积和 二.分析 参考文章:click here 具体的公式推导可以看参考文章.博主的证明很详细. 自己在写的时候问题不在公式推导,公式还是能够比较顺利的推导出来,但是,码力不够,比如说在乘积的时候,因为输入时候的$n$和$m$没有注意,一直用的$int$类型的,导致中间结果早就爆了,自己却浑然不知. 还有一个细节就是题目给的模数不是质数,所以求逆元的时候需要使用扩展欧几里得进行求解逆元. 三.AC代码 1 #include <bits/stdc++.h…
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=19940417; const double eps=1e-8; const…
https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力推式子即可 #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define fi first #define se seco…
题意 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}n\%i*m\%j*[i!=j]\) \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}n\%i*m\%j-\sum\limits_{i=1}^{min(n,m)}n\%i*m\%i\) \(\sum\limits_{i=1}^n(n-\lfloor\frac{n}{i}\rfloor*i)\sum\limits_{j=1}^m(m-\lfloor\frac{m}{…
整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数列求和或对于积性函数的筛法等,然后就可以用整除分块的思想做. 题目解法 化公式变成比较方便的形式: \(\ \sum_{i = 1}^n \sum_{j = 1}^m (n \mod i)(m \mod j), i \ne j\) \(= \sum_{i = 1}^n \sum_{j = 1}^m…
题意 求 $\sum_{i=1}^n \sum_{j=1}^m (n \ mod \ i)*(m \ mod \ j)$($i \neq j$),$n,m \leq 10^9$答案对 $19940417$ 取模. 分析: 由于取模可化成取整的形式,$k \ mod \ i = k - \left \lfloor \frac{k}{i} \right \rfloor * i$,详见BZOJ1257 余数之和. 易知,$\sum_{i=1}^n \sum_{j=1}^m (n \ mod \ i)*…
Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在 ci,j根不同颜色的绳子中选择一根将它们连接.如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图.特别地,珠子不能和自己连接. 铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体.由于答案可能很大,因此只需输出答案对1000000007取模的结果…
题意 题目链接 Sol 啊啊这题好恶心啊,推的时候一堆细节qwq \(a \% i = a - \frac{a}{i} * i\) 把所有的都展开,直接分块.关键是那个\(i \not= j\)的地方需要减.... 然后就慢慢写就好了 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second #defi…
题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(q\) 次操作,每次操作形如以下三种: I a b c,表示将 \([a,b]\) 内的元素加 \(c\). R a b,表示将 \([a,b]\) 内的元素变成相反数. Q a b c,表示在 \([a,b]\) 内所有选出 \(c\) 个元素的乘积之和. 对于每一个询问操作,输出答案对 \(19940417\) 取模的值. \(\texttt{Data Range:}1\leq n\leq q\leq 50000\) 题解 好题啊…