式子化出来是$\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]数表的更多相关文章

  1. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

  2. 洛谷P3312 - [SDOI2014]数表

    Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...

  3. [bzoj3529] [洛谷P3312] [Sdoi2014] 数表

    Description 有一张n×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  4. 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)

    传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...

  5. 洛咕3312 [SDOI2014]数表

    洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...

  6. P3312 [SDOI2014]数表

    啊啊啊我昨天怎么没写题解wwww 补昨日题解... 题目链接 : https://www.luogu.org/problemnew/show/P3312 也是莫反 我要把fft留到今天写 [和zyn小 ...

  7. 洛谷 P3313 [SDOI2014]旅行 解题报告

    P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...

  8. luogu P3312 [SDOI2014]数表

    传送门 我们看要求的东西\[\sum_{i=1}^{n}\sum_{j=1}^{m}[\sigma(gcd(i,j))\le a]\sigma(gcd(i,j))\] 然而\(\le a\)比较烦,可 ...

  9. 洛谷P3317 [SDOI2014]重建 [Matrix-Tree定理]

    传送门 思路 相信很多人像我一样想直接搞Matrix-Tree定理,而且还过了样例,然后交上去一分没有. 但不管怎样这还是对我们的思路有一定启发的. 用Matrix-Tree定理搞,求出的答案是 \[ ...

随机推荐

  1. 从.Net版本演变看String和StringBuilder性能之争

    在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...

  2. activemq的安装使用

    近期有项目中用到消息队列,JMS规范中实现最好的开源框架就是activemq.所以选择它(当然这是我老大决定的,像我这样的刚入职场的小菜鸟考虑问题还不太全面)作为消息队列数据传输.公司有有成型的消息队 ...

  3. HDU 6096 String 排序 + 线段树 + 扫描线

    String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...

  4. HDU 6068 Classic Quotation KMP+DP

    Classic Quotation Problem Description When online chatting, we can save what somebody said to form h ...

  5. 【ACdream】1157 Segments cdq分治

    Segments   Problem Description 由3钟类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i ...

  6. 在无代码文件的aspx文件中添加类、函数和字段的方法

    大家都知道,在开始WebForm程序时,一个WebForm由.cs代码文件与.aspx页面文件组成.在aspx文件中可以嵌入C#代码,但无法在aspx的嵌入C#代码中定义类,函数和字段等.这样,就限制 ...

  7. Android 单击跳转到打电话发短信界面,长按打电话发短信

    <uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission a ...

  8. Hadoop MapReduce输入输出类型

    一.输入格式 1.输入分片split 一个分片对应一个map任务: 一个分片包含一个表(整个文件)上的若干行,而一条记录(单行)对应一行: 分片包含一个以字节为单位的长度 和 一组存储位置,分片不包含 ...

  9. NEU 1683: H-Index

    题目描述 Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...

  10. MYSQL进阶学习笔记十:MySQL慢查询!(视频序号:进阶_23-24)

    知识点十一:MySQL 慢查询的应用(23) 一.慢查询定义 MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询. 查看时间限制 show variables lik ...