题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815

思路就和这里一样:https://blog.csdn.net/leolyun/article/details/70146612

不知为何乘逆元就错了,必须直接除...不过题目保证了是整数,所以直接除也没问题;

然后重新学习了一下分块的简洁写法,就能A了hhh

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=4e6+,mod=1e9+,base=,xb=;
int n,cnt,pri[xn],phi[xn],g[xn],blk[xn],s[xn],pls[xb];
bool vis[xn];
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
ll pw(ll a,int b)
{
ll ret=;
for(;b;b>>=,a=(a*a)%mod)if(b&)ret=(ret*a)%mod;
return ret;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
void init()
{
phi[]=;
for(int i=;i<=n;i++)
{
if(!vis[i])pri[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&(ll)i*pri[j]<=n;j++)
{
vis[i*pri[j]]=;
if(i%pri[j])phi[i*pri[j]]=(ll)phi[i]*(pri[j]-)%mod;
else {phi[i*pri[j]]=(ll)phi[i]*pri[j]%mod; break;}
}
}
for(int i=;i<=n;i++)g[i]=(ll)i*i%mod*phi[i]%mod;
for(int i=;i<=n;i++)g[i]=upt(g[i-]+g[i]);
}
void init2()
{
for(int i=;i<=n;i++)blk[i]=(i-)/base+;
for(int i=;i<=n;i++)s[i]=(s[i-]+(ll)i*i)%mod;
}
void change(int d,ll x)//add x
{
for(int i=d;blk[i]==blk[d]&&i<=n;i++)s[i]=upt(s[i]+x);
for(int i=blk[d]+;i<=blk[n];i++)pls[i]=upt(pls[i]+x);
}
int cal(int ps)
{
return upt(pls[blk[ps]]+s[ps]);
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{
int m=rd(); n=rd();
init(); init2(); ll x;
for(int i=,a,b,k;i<=m;i++)
{
a=rd(); b=rd(); x=rd(); k=rd();
int d=gcd(a,b);
//int t1=(ll)d*pw(a,mod-2)%mod,t2=(ll)d*pw(b,mod-2)%mod;
ll t=((ll)a/d)*(b/d); x=(x/t)%mod;//
change(d,upt(x-cal(d)+cal(d-)));
//change(d,x*t1%mod*t2%mod);
int ans=;
for(int j=,nxt;j<=k;j=nxt+)
{
nxt=k/(k/j);
ans=(ans+(ll)g[k/j]*upt(cal(nxt)-cal(j-)))%mod;
}
printf("%d\n",ans);
}
return ;
}

bzoj 4815 小Q的表格 —— 反演+分块的更多相关文章

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

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

  2. [CQOI2017]小Q的表格(数论+分块)

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

  3. [BZOJ4815][CQOI2017]小Q的表格 数论+分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...

  4. [CQOI2017]小Q的表格——反演好题

    zhoutb2333的题解 难得一见的新颖反演题. 一眼看可能不是反演题. 修改影响别的,很恶心. 所以考虑化简f的联系式,发现和gcd有关 于是考虑用gcd来表示所有的gcd(a,b)=g的所有f( ...

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

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

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

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

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

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

  8. 【CQOI2017】小Q的表格

    [CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...

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

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

随机推荐

  1. Eclipse 查看第三方jar包文件源代码解决方法

    1.打开第三方依赖包,源文件的快捷键:ctrl + mouseClick 2.由于我们下载的第三方jar 包,如Spring等相关的依赖包时,并没有附加下载相应的源文件,所以经常出现如图的这种问题. ...

  2. Chrome Native Messaging 与本地程序之间的通信

    最近项目上出现了web打印不稳定的问题,师父决定web调用本地打印程序,在查阅了相关资料和加了几个相关群咨询后得知新版的chrome不支持NNAPI了,最好用Native Messaging来处理,经 ...

  3. Full卷积 Same卷积 Vaild卷积

  4. [note]高精度模板

    高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...

  5. 关于 IN UPDATE TASK

    [转 http://blog.sina.com.cn/s/blog_6f74e6d50100sq57.html]更新程序必须用一个特殊的FM(update module)来实现. 1.Exportin ...

  6. sin6_addr打印:string to sockaddr_in6 and sockaddr_in6 to string

    函式原型: #include <arpa/inet.h> const char *inet_ntop(int af, const void *src, char *dst, socklen ...

  7. 从分布式锁来看redis和zookpeer!

    从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...

  8. ARDUINO使用GPRS发送GPS数据到OneNet测试

    功能: 测试把固定的GPS数据发送到OneNet平台 调试途中碰到的问题 ARDUINO不支持sprintf的double打印,只能转换为char字符串然后再%s打印 #include <Tim ...

  9. sql获取数组长度

    需求:获取字符串数组1,2,3,4的长度,当然也可以是其他分隔符1|2|3等 方法:通过自定义函数来实现 /* 获取字符串数组长度 */ from sysobjects where id = obje ...

  10. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...