洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
不考虑$a$的影响
设$f(i)$为$i$的约数和
$$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$
$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\sum\limits_{j=1}^{\lfloor \frac m d \rfloor } [gcd(i,j)==1]$$
这个东西直接反演一下
$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\mu(i) \lfloor \frac n {di} \rfloor \lfloor \frac m {di} \rfloor$$
然后转为枚举$di$
$$=\sum\limits_{D=1}^{n}\sum\limits_{d|D}f(d)\mu(\frac D d) \lfloor \frac n {D} \rfloor \lfloor \frac m {D} \rfloor$$
对于每一个$i$可以用整除分块把它前缀和的贡献算出来,然后用树状数组动态维护前缀和
然后我们考虑$a$的限制。把所有询问离线按$a$排序,从小到大处理处理询问,每处理到一个询问就把所有的$f(d)<=a$的$d$的贡献都累加起来,直接树状数组查询一下就可以了
然后听大佬们说这题取模直接自然溢出就可以了,然后不知道为啥最后还要$\&$一个$0x7fffffff$
- //minamoto
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #define ui unsigned int
- using namespace std;
- #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
- char buf[<<],*p1=buf,*p2=buf;
- template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
- inline int read(){
- #define num ch-'0'
- char ch;bool flag=;int res;
- while(!isdigit(ch=getc()))
- (ch=='-')&&(flag=true);
- for(res=num;isdigit(ch=getc());res=res*+num);
- (flag)&&(res=-res);
- #undef num
- return res;
- }
- char sr[<<],z[];int C=-,Z;
- inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
- inline void print(int x){
- if(C><<)Ot();if(x<)sr[++C]=,x=-x;
- while(z[++Z]=x%+,x/=);
- while(sr[++C]=z[Z],--Z);sr[++C]='\n';
- }
- const int N=1e5;
- int p[N];ui mu[N+],f[N+],c[N+],ans[N+];
- int a[N+],m,q,n,vis[N+];
- struct node{
- int n,m,val,id;
- node(){}
- node(int n,int m,int val,int id):n(n),m(m),val(val),id(id){}
- inline bool operator <(const node &b)const
- {return val<b.val;}
- }t[N];
- inline bool cmp(const int &a,const int &b){return f[a]<f[b];}
- inline void add(int x,ui y){
- for(;x<=N;x+=x&-x) c[x]+=y;
- }
- inline ui query(int x){
- ui res=;
- for(;x;x-=x&-x) res+=c[x];
- return res;
- }
- void init(){
- mu[]=;
- for(int i=;i<=N;++i){
- if(!vis[i]) p[++m]=i,mu[i]=-;
- for(int j=;j<=m&&p[j]*i<=N;++j){
- vis[i*p[j]]=;
- if(i%p[j]==) break;
- mu[i*p[j]]=-mu[i];
- }
- }
- for(int i=;i<=N;++i)
- for(int j=i;j<=N;j+=i)
- f[j]+=i;
- for(int i=;i<=N;++i) a[i]=i;
- sort(a+,a++N,cmp);
- }
- int main(){
- // freopen("testdata.in","r",stdin);
- init();
- q=read();
- for(int i=,x,y,z;i<=q;++i){
- x=read(),y=read(),z=read();
- if(x>y) swap(x,y);cmax(z,);
- t[i]=node(x,y,z,i);
- }
- sort(t+,t+q+);
- for(int i=,j=,k;i<=q;++i){
- for(;f[a[j]]<=t[i].val;++j)
- for(k=a[j];k<=N;k+=a[j])
- add(k,f[a[j]]*mu[k/a[j]]);
- for(int l=,r;l<=t[i].n;l=r+){
- r=min(t[i].n/(t[i].n/l),t[i].m/(t[i].m/l));
- ans[t[i].id]+=(t[i].n/l)*(t[i].m/l)*(query(r)-query(l-));
- }
- }
- for(int i=;i<=q;++i) print(ans[i]&0x7fffffff);
- Ot();
- return ;
- }
洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)的更多相关文章
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组
$ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)
link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...
- bzoj 3529 数表 莫比乌斯反演+树状数组
题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- 洛谷 P3312 [SDOI2014]数表 解题报告
P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...
随机推荐
- TEA对称加密算法
今天在看<Distributed Systems Concepts and Design>这本书的时候,在讲到分布式系统的安全性的时候,给出了TEA算法,书本上有现成的代码,所以摘录下来以 ...
- SVD分解的理解
对称阵A 相应的,其对应的映射也分解为三个映射.现在假设有x向量,用A将其变换到A的列空间中,那么首先由U'先对x做变换: 由于正交阵“ U的逆=U‘ ”,对于两个空间来讲,新空间下的“ 基E' 坐标 ...
- 15款创建美丽幻灯片的 jQuery 插件
1. Skippr Skippr 是一个超级简单的 jQuery 幻灯片插件.仅仅是包含你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了. Sk ...
- java中科学计数法数字转字符串
开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...
- win10安装VMware
首先下载VMware安装包: 双击安装: 点击:“uninstall”安装,这个过程需要一些时间 点击“Next” 选择典型或者自定义安装 这里我选择的是典型安装,点击“Next”: 选择是否检查更新 ...
- [CPP] Coding Style
C++ Coding Style C++很多强大的语言特性导致它的复杂,其复杂性会使得代码更容易出现bug.难于阅读和维护. 由于,本人有一点点代码洁癖,所以依照Google的C++编程规范<G ...
- Double.valueOf()与Double.parseDouble()两者的区别
写代码用到这两个方法,不知道有什么区别,看一下源码: Double.parseDouble(String str) public static double parseDouble(String s) ...
- BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1001 题解: 1.trie树 关 ...
- jinja 多值合并
示例 {% for node in groups["db"] %} {{ node | join("") }}:5672 {% if not loop.last ...
- webstorm代码提示按键改为alt+/
webstorm代码提示默认按键为ctrl+空格 但是windows输入法中英文输入法的默认按键也是ctrl+空格 这就导致webstorm按键冲突,无法使用代码快捷提示按键 解决方法: 按ctrl+ ...