洛谷 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定理搞,求出的答案是 \[ ...
随机推荐
- HDU 6086 Rikka with String AC自动机 + DP
Rikka with String Problem Description As we know, Rikka is poor at math. Yuta is worrying about this ...
- split+ Pattern切割字符串
今天在对一个String对象进行拆分的时候,总是无法到达预计的结果.呈现数据的时候出现异常,后来debug之后才发现,错误出在String spilt上,于是开始好好研究下这东西,开始对api里的sp ...
- hadoop的一般端口使用
- hadoop报JAVA_HOME is not set暂时解决办法
直接在etc/hadoop/hadoop-env.sh中 export JAVA_HOME=XXX
- 关于div li 等标签之间自带间距
可以用float来清除标签之间的间距. ps :ul使用font-size:0 唯一的缺点就是要再次设置LI的font-size
- Kafka使用kclient三种使用方法
kclient提供了三种使用方法,对于每一种方法,按照下面的步骤可快速构建Kafka生产者和消费者程序. 前置步骤1) 下载源代码后在项目根目录执行如下命令安装打包文件到你的Maven本地库. mvn ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- 深入浅出Oracle学习笔记:Buffer Cache 和Shared pool
Buffer cache 和 share pool 是sga中最重要最复杂的部分. 一.Buffer Cache 通常数据的读取.修改都是通过buffer cache 来完成的.buffer cach ...
- c#-关于自动属性的思考
参考:c#-关于自动属性的思考 我的理解:自动属性跟 公有字段 一模一样,编程习惯而已.目前是这么认为的. 自动属性:public string Name{ get; set } 公有字段:pub ...
- SpringMVC之使用Validator接口进行验证
对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证.SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提 ...