洛谷 P3312 [SDOI2014]数表
式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{k})[\sigma(k)<=a]\sigma(k)$
如果没有a的限制的话,显然只要把后面那个sigma预处理出来
有了a的限制呢?考虑把询问按a从小到大排序,然后每次把所有满足$lasta<\sigma(k)<=nowa$(lasta指上个询问的a,nowa指当前询问的a)的加入后面那部分的贡献(开始时对于每个T预处理有哪些k满足$\sigma(k)=T$,这里就暴力枚举k使得$\sigma(k)$=当前要加入贡献的值,再暴力枚举k的倍数更新);用树状数组维护前缀和;复杂度是n*log^2+T*sqrt*log
错误记录:
1.121行<=n写成<=m;导致除以0;本地测试的时候只用了n=m的数据,所以没测出来
2.108行没规定这个<=500000
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll N=;
const ll M=;
struct Q
{
ll n,m,a,num;
}q[M+];
ll qq;
ll ans[M+];
ll mu[N+],len,prime[N+];
ll f1[N+],f2[N+],h[N+];
//分别为最小质因子的p^k,1+p^0+p^1+..+p^k,函数值
vector<int> dd[];
bool nprime[N+];
bool c1(const Q &a,const Q &b) {return a.a<b.a;}
const ll md=1LL<<;
#define lowbit(x) ((x)&(-x))
ll d[N+];
void add(ll p,ll x)
{
for(;p<=N;p+=lowbit(p)) d[p]+=x;
}
ll sum(ll p)
{
ll ans=;
for(;p>;p-=lowbit(p)) ans+=d[p];
return ans;
}
//ll Mod(ll a,ll b)
//{
// if(a>=0) return a%b;
// else if(a%b==0) return 0;
// else return b+a%b;
//}
int main()
{
ll i,j,k,n,m,an;
mu[]=;h[]=;
for(i=;i<=N;i++)
{
if(!nprime[i])
{
prime[++len]=i;mu[i]=-;
f1[i]=i;f2[i]=i+;h[i]=i+;
}
for(j=;j<=len&&i*prime[j]<=N;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==)
{
mu[i*prime[j]]=;
f1[i*prime[j]]=f1[i]*prime[j];
f2[i*prime[j]]=f2[i]+f1[i*prime[j]];
h[i*prime[j]]=h[i]/f2[i]*f2[i*prime[j]];
break;
}
else
{
mu[i*prime[j]]=-mu[i];
f1[i*prime[j]]=prime[j];
f2[i*prime[j]]=+prime[j];
h[i*prime[j]]=h[i]*f2[i*prime[j]];
}
}
}
for(i=;i<=N;i++)
dd[h[i]].pb(i);
/*
ll ttt=0;
for(i=1;i<=20000;i++) ttt=max(ttt,h[i]);
printf("%lld",ttt);
{
ll a,n,m,k;
while(1)
{
scanf("%lld%lld%lld",&n,&m,&a);
if(n>m) swap(n,m);
ll ans=0;
for(ll T=1;T<=m;T++)
{
ll a1=0;
for(k=1;k<=T;k++)
if(T%k==0)
{
a1+=mu[T/k]*(h[k]<=a)*h[k];
}
ans+=(n/T)*(m/T)*a1;
}
printf("%lld\n",ans);
}
}*/
scanf("%lld",&qq);
for(i=;i<=qq;i++) scanf("%lld%lld%lld",&q[i].n,&q[i].m,&q[i].a),q[i].num=i;
sort(q+,q+qq+,c1);
for(i=,j=;i<=qq;i++)
{
while(j+<=q[i].a&&j+<=)
{
j++;
for(auto d:dd[j])
{
for(k=d;k<=N;k+=d)
{
add(k,mu[k/d]*j);
}
}
}
if(q[i].n>q[i].m) swap(q[i].n,q[i].m);
n=q[i].n;m=q[i].m;an=;
for(ll i=,j;i<=n;i=j+)
{
j=min(n/(n/i),m/(m/i));
an+=(n/i)*(m/i)*(sum(j)-sum(i-));
}
ans[q[i].num]=an;
//printf("a%lld\n",an);
}
for(i=;i<=qq;i++) printf("%lld\n",ans[i]%md);
return ;
}
洛谷 P3312 [SDOI2014]数表的更多相关文章
- 洛谷 P3312 [SDOI2014]数表 解题报告
P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...
- 洛谷P3312 - [SDOI2014]数表
Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...
- [bzoj3529] [洛谷P3312] [Sdoi2014] 数表
Description 有一张n×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...
- 洛咕3312 [SDOI2014]数表
洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...
- P3312 [SDOI2014]数表
啊啊啊我昨天怎么没写题解wwww 补昨日题解... 题目链接 : https://www.luogu.org/problemnew/show/P3312 也是莫反 我要把fft留到今天写 [和zyn小 ...
- 洛谷 P3313 [SDOI2014]旅行 解题报告
P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...
- luogu P3312 [SDOI2014]数表
传送门 我们看要求的东西\[\sum_{i=1}^{n}\sum_{j=1}^{m}[\sigma(gcd(i,j))\le a]\sigma(gcd(i,j))\] 然而\(\le a\)比较烦,可 ...
- 洛谷P3317 [SDOI2014]重建 [Matrix-Tree定理]
传送门 思路 相信很多人像我一样想直接搞Matrix-Tree定理,而且还过了样例,然后交上去一分没有. 但不管怎样这还是对我们的思路有一定启发的. 用Matrix-Tree定理搞,求出的答案是 \[ ...
随机推荐
- Java获取域名
private static final char URL_SPLASH = '/'; private static final String URL_SCHEME_POSTFIX = ": ...
- Quartz深入浅出(二)
Hello Quartz / 本文通过一个简单的样例让大家高速了解Quartz,上手.并了解Quartz内的一些关键对象 如 Scheduler.Job.Trigger.JobExecutionCon ...
- linux下的文件和文件夹的权限问题
1 文件和文件夹的权限 文件和文件夹的权限设置的根本目的是控制人对它们的访问. 2 用户分类 本文件的拥有者.本文件所属的grou.其它用户. 3 也就是说 在读写文件或者文件夹时,要看看自己是属于哪 ...
- mysql_proxy
mysql_proxy中间件实现:读写分离.负载均衡. mysql_proxy中间件实现:读写分离.负载均衡. 负载均衡:给多台数据库,看能不能均匀的分给不同的数据库. 客户端连的是proxy,此时的 ...
- JVM Safepoint 安全点
一.什么是安全点: 在可达性分析算法中查找存活的对象,首先要找到哪些是GC Roots: 有两种查找GC Roots的方法: 一种是遍历方法区和栈区来查找(保守式GC): 一种是通过OopMap的数据 ...
- WinDbg设置托管进程断点
WinDbg的Live模式调试..Net 托管代码 ,使用bp,bu,bm无法设置断点,也许是我不会.研究了下,托管代码有自己的命令,!BPMD 模块名 完全限定的方法名 步骤: 1.查找进程PID, ...
- object_funs.py
#__init__ 构造方法,双下划线 #__del__ 析构方法,在对象就要被垃圾回收前调用.但发生调用 #的具体时间是不可知的.所以建议尽量避免使用__del__ print('-------ex ...
- iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别!
在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int.unsigned int.我们知道iOS也可以使用g++编译器,那么它们之间是否 ...
- 【扬中集训 DAY4T3】holiday
[题目链接] 点击打开链接 [算法] 建C棵线段树即可,注意要用前缀和优化 [代码] 这是标程 #include <bits/stdc++.h> using namespace std; ...
- javacv开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...