承接一下洛咕上的题解,这里基本就是谈谈优化,放个代码的

我们发现这里的常数主要来自于除法,那么我们优化除法次数,把所有的 \(n/1...n/s\) (\(s=\sqrt n\))存下来,然后归并排(其实就是 merge 一下),最后 unique 去个重,然后就可以进行小常数的数论分块了

//by Judge
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=1e9+7;
const int M=1e6+3;
typedef int arr[M*20];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){ Rg int x=0; char c=getchar(); for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x;
} char sr[1<<21],z[21];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot(); while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z); sr[++CCF]=chr;
} int cnt; ll phi[M]; arr v,p,A,B,C;
#define get(x,y) (x/y?x/(x/y):c)
#define swap(a,b) (a^=b^=a^=b)
inline int Min(Rg int x,Rg int y){return x<y?x:y;}
int main(){
int T=read(),n=read(),m=read(); if(n>m) swap(n,m); v[1]=phi[1]=1;
for(int i=2;i<=n;++i){ if(!v[i]) p[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*p[j]<=n;++j){ v[i*p[j]]=1;
if(!(i%p[j])){ phi[i*p[j]]=phi[i]*p[j]; break;
} phi[i*p[j]]=phi[i]*(p[j]-1);
} phi[i]+=phi[i-1];
} ++T;
while(--T){ Rg int a=read()-1,b=read()-1,c=read(),d=read();
if(c>d) swap(c,d),swap(a,b); Rg ll ans=0;
*A=0; fd(i,sqrt(a),1) A[++*A]=a/i;
*B=0; fd(i,sqrt(b),1) B[++*B]=b/i;
merge(A+1,A+*A+1,B+1,B+*B+1,C+1),*C=*A+*B;
*B=0; fd(i,sqrt(c),1) B[++*B]=c/i;
merge(C+1,C+*C+1,B+1,B+*B+1,A+1),*A=*C+*B;
*B=0; fd(i,sqrt(d),1) B[++*B]=d/i;
merge(A+1,A+*A+1,B+1,B+*B+1,C+1),*C=*A+*B;
*B=0; fp(i,1,sqrt(d)) B[++*B]=i;
merge(C+1,C+*C+1,B+1,B+*B+1,A+1),*A=*C+*B;
*A=unique(A+1,A+*A+1)-1-A,*C=*A,*A=0;
Rg int l,r; fp(i,1,*C) l=A[i-1]+1,r=A[i],
ans+=(phi[r]-phi[l-1])*(c/l-a/l)*(d/l-b/l); print(ans%mod);
} return Ot(),0;
}

话说 min25 也太神仙了,交了一发,结果快成那个样子,惊

最新文章

  1. dede织梦批量导入关键词
  2. 快速将一个表的数据生成SQL插入语句
  3. paip.重装系统需要备份的资料总结..v2.0 cad
  4. ThinkPHP 3.2.3 自动加载公共函数文件的方法
  5. 【Python】我的Python学习笔记【1】【using Python 2】
  6. mongodb在win7下的安装和使用
  7. openId 列表
  8. process launch failed : failed to get the task for process xxx
  9. C++Memset误区
  10. jquery点击按钮显示和隐藏DIv
  11. Java线程间通信之wait/notify
  12. dojo中表格行隐藏出错
  13. pdf 下载demo
  14. github使用的小坑 处理
  15. 为Spring Cloud Config插上管理的翅膀
  16. git比较两个分支的文件的差异
  17. POJ3252-RoundNumbers-排列组合
  18. 并发容器——ConcurrentHashMap
  19. linux 查看tcp数量
  20. 转换CLOB字段类型为VARCHAR2, lob类型不支持的sql语句

热门文章

  1. Linux记录-配置无密码登录
  2. EF部分字段更新,忽略为null字段
  3. .net多站点通过StateServer实现session共享
  4. mq【转】
  5. Asp.net+WebSocket+Emgucv实时人脸识别
  6. Linux系统中用户组、文件权限浅解
  7. MySQL 字符集问题
  8. error: Microsoft Visual C++ 14.0 is required. Get it with &quot;Microsoft Visual C++ Build Tools&quot;: http://landinghub.visualstudio.com/visual-cpp-build-tools
  9. vim 配置一:
  10. 【C++】reference parameter-引用参数