把式子化简一波。

发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点。

然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j<=k}[gcd(i,j)==g](i/g)*(i/g)$

然后考虑它的意义,直接发现计算出$i*i*\phi(i)$的前缀和就可以下界函数分块计算了。

这样子还是过不了。考虑修改次数比较少,考虑分块维护,就可以$O(1)$查询了。

复杂度$m\sqrt {n}$

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
#define ll long long
#define mp make_pair const ll md=1000000007; void Finout()
{
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
} #define maxn 10000001
int a[maxn],phi[maxn],f[maxn];
int vis[maxn],pri[maxn],top=0,m,n; ll Getll()
{
ll x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} void Shaker()
{
phi[1]=1;
F(i,2,n)
{
if (!vis[i]) pri[++top]=i,phi[i]=i-1;
for (ll j=1;j<=top&&(ll)i*pri[j]<=(ll)n;++j)
{
vis[i*pri[j]]=1;
if (i%pri[j]==0)
{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
else phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
F(i,1,maxn-1) phi[i]=phi[i]*i%md*i%md+phi[i-1],phi[i]%=md;
} int sum[50005],pre[maxn];
int L[50005],R[50005],bel[maxn],T,tot=0; void add(ll x,ll d)
{
F(i,x,R[bel[x]])
{
pre[i]+=d,pre[i]%=md;
}
F(i,bel[x],tot)
{
sum[i]+=d,sum[i]%=md;
}
} ll gs(ll x)
{
if (x==0) return 0;
ll ret=0;
ret=sum[bel[x]-1]+pre[x];
ret%=md;
return ret;
} ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);} ll cal(ll k)
{
ll ret=0;
for (ll i=1,last=0;i<=k;i=last+1)
{
last=k/(k/i);
ret+=phi[k/last]*((gs(last)-gs(i-1))%md);
ret%=md;
}
return (ret+md)%md;
} void init()
{
T=sqrt(n); //printf("Block Size is %d\n",T);
for (ll i=1;i<=n;i+=T)
{
L[++tot]=i;
R[tot]=i+T-1;
}
R[tot]=n;
F(i,1,tot) F(j,L[i],R[i]) bel[j]=i;
} int main()
{
m=Getll();n=Getll();
init();
Shaker();
F(i,1,n) a[i]=((ll)i*i)%md;
F(i,1,n) (a[i]+=a[i-1])%=md;
F(i,1,tot) sum[i]=a[R[i]];
F(i,1,tot)
{
pre[L[i]]=(a[L[i]]-a[L[i]-1])%md;
F(j,L[i]+1,R[i]) pre[j]=(pre[j-1]+a[j]-a[j-1])%md;
}
sum[0]=0;
F(i,1,m)
{
ll a,b,k,x;
a=Getll();b=Getll();x=Getll();k=Getll();
ll g=gcd(a,b);
add(g,-gs(g)+gs(g-1));
ll tmp=x/(a/g)/(b/g);
tmp%=md;
add(g,tmp);
printf("%lld\n",cal(k));
}
}

  

BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数的更多相关文章

  1. BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...

  2. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  3. bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】

    参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...

  4. bzoj 4815 [Cqoi2017]小Q的表格——反演+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...

  5. 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块

    (Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...

  6. [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)

    4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 832  Solved: 342[Submit][Statu ...

  7. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  8. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  9. [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格

    Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...

随机推荐

  1. [windows]解决Win7访问Windows 2003、XP共享慢的问题

    解决方法: 1. 修改网卡配置打开本地连接属性,点击"配置"在"高级"选项卡中,将"大型发送分载(IPv4)"的值设置成"禁用&q ...

  2. MFC技术积累——基于MFC对话框类的那些事儿

    1. 创建对话框类 (1)打开VC++6.0环境,点击:文件→新建: (2)在弹出的新建对话框中选择:工程→MFC AppWizard (exe)→输入工程名称(例如:功能调试)→工程保存路径名→确定 ...

  3. org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/home/index2", template might not exist or might not be accessible by any of the configured Template Resolvers

    org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/home/index2", ...

  4. 如何在Kubernetes里创建一个Nginx service

    Jerry之前的文章如何在Kubernetes里创建一个Nginx应用,已经使用kubectl命令行创建了Pod,但是在kubernetes中,Pod的IP地址会随着Pod的重启而变化,因此用Pod的 ...

  5. ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, url: jdbc:mysql://localhost:3306/xhb?useUnicode=true&characterEncoding=UTF-8, errorCode 1045, sta

    ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, ...

  6. (五)VMware Harbor 部署之SSL

    转自:https://www.cnblogs.com/Rcsec/p/8479728.html 1 .签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名 ...

  7. 电脑上文件的后缀名被隐藏,把一个文本文件改成.bat时,默认打开的还是文本。

    1.打开文件夹,选择组织,点击“文件夹和搜索选项”,如图: 2.选择“查看”,找到“隐藏已知文件类型的扩展名”,不要勾选这一项,如图: 3.点击“确定”或者“应用”

  8. javase(12)_集合框架_Queue

    一.Queue Queye接口体系图 体系分析: Deque实现类:ArrayDeque, LinkedList(数组和链表实现双向队列) BlockingDeque实现类:LinkedBlockin ...

  9. shell脚本调试打印日志问题

    shell脚本调试打印日志问题 1. 需求 我们在编写脚本的时候,有时候需要做调试,便于我们定位问题,有时候等脚本上线之后,我们需要保留脚本执行过程中的记录.便于我们在出问题的时候,定位问题. 2. ...

  10. [LUOGU] P1024 选课

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...