博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2693 jzptab
阅读量:6259 次
发布时间:2019-06-22

本文共 1591 字,大约阅读时间需要 5 分钟。

http://www.lydsy.com/JudgeOnline/problem.php?id=2693

 

题解:

考虑把lcm转化成gcd

那答案就是
然后神奇的设:
就有:
一样可以枚举

 的取值,这是O(√n)的;

然后求f(x,y);

大概证明了一下= =

线性筛之后也可以O(√n)求出f(x,y)

总复杂度O(n),常数略大。。

这题显然是卡O(n)过不了呗

那就还得优化

预处理这玩意

然后O(√n)就搞出来啦!

“积性函数的约数和也是积性函数”  ->好像比较显然?
所以g(D)是积性函数
线性筛裸上就好

#include
#include
#include
#include
#include
#define ll long longconst ll Mod=100000009;ll g[10010005],p[10010005],sum[10010005];bool mark[10010005];ll read(){ ll t=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} return t*f;}void init(){ g[1]=sum[1]=1; for (ll i=2;i<10010000;i++){ if (!mark[i]){ p[++p[0]]=i; g[i]=(ll)((i-i*i)%Mod+Mod)%Mod; } for (ll j=1;j<=p[0]&&p[j]*i<=10010000;j++){ mark[i*p[j]]=1; if (i%p[j]==0){ g[i*p[j]]=g[i]*(p[j])%Mod; break; }else g[i*p[j]]=g[i]*g[p[j]]%Mod; } sum[i]=sum[i-1]+g[i]; }}ll F(ll x,ll y){ return (((x*(x+1)/2LL)%Mod)*((y*(y+1)/2LL)%Mod))%Mod;}int main(){ init();int T=read(); while (T--){ ll n=read(),m=read(); if (n>m) std::swap(n,m); ll j;ll ans=0; for (ll i=1;i<=n;i=j+1){ j=std::min(n/(n/i),m/(m/i)); ans+=((sum[j]-sum[i-1]%Mod+Mod)%Mod)*F(n/i,m/i); ans%=Mod; } printf("%lld\n",ans); }}

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5674815.html

你可能感兴趣的文章
go装饰模式,一个屌丝撸管的故事
查看>>
学习设计模式——命令模式
查看>>
【POJ】第一章 C/C++语言概述
查看>>
如何封装自己的js类库
查看>>
项目管理小小知识点总结
查看>>
ASP.NET之Javascript脚本的应用
查看>>
vlan间的互通
查看>>
ldconfig详解
查看>>
VBScript 页面的简单样例
查看>>
用c语言指针实现给整形数组冒泡排序
查看>>
ORA-01075,ORA-09925 Read-only file system问题一例
查看>>
Script:收集介质恢复诊断信息
查看>>
SocketIO 随笔
查看>>
Maven学习三之新建maven项目
查看>>
HTML5本地存储-localStorage如何实现定时存储
查看>>
LAMP之Centos6.5安装配置Apache(二)
查看>>
Tomcat集群
查看>>
shell脚本中输出带颜色字体实例分享及chrony时间同步
查看>>
简单计时
查看>>
面试心得
查看>>