您的位置:首页 > 其它

Bzoj2693 jzptab

2017-04-14 23:49 316 查看

Time Limit: 10 Sec  Memory Limit: 512 MB

Submit: 1436  Solved: 568

Description

 

Input

一个正整数T表示数据组数

接下来T行 每行两个正整数 表示N、M

 

Output

T行 每行一个整数 表示第i组数据的结果

 

Sample Input

1

4 5

Sample Output

122

HINT
T <= 10000

N, M<=10000000

HINT

 

Source

版权所有者: 倪泽堃

 

数学问题 莫比乌斯反演

 

终于会筛积性函数啦——

似乎以前的理解有一部分想岔了……

在Bzoj2154的基础上再推几步就能get $O(sqrt(n))$ 的算法

因为很困所以不写题解了233

 

/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
const int mod=1e8+9;
const int mxn=1e7+3;
int read(){
int 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;
}
int pri[mxn],cnt;
LL g[mxn],smm[mxn];
bool vis[mxn];
void init(){
g[1]=1;
for(int i=2;i<mxn;i++){
if(!vis[i]){
pri[++cnt]=i;
g[i]=1-i;
}
for(int j=1;j<=cnt && (LL)pri[j]*i<mxn;j++){
vis[pri[j]*i]=1;
if(i%pri[j]==0){
g[pri[j]*i]=g[i];
break;
}
g[pri[j]*i]=g[i]*g[pri[j]]%mod;
}
}
for(int i=1;i<mxn;i++)
smm[i]=(smm[i-1]+g[i]*i%mod)%mod;
return;
}
inline int SS(int x,int y){
return ((LL)x*(x+1)/2%mod)*((LL)y*(y+1)/2%mod)%mod;
}
LL calc(int n,int m){
if(n>m)swap(n,m);
LL res=0;int pos;
for(int i=1;i<=n;i=pos+1){
int x=n/i,y=m/i;
pos=min(n/x,m/y);
res=(res+(smm[pos]-smm[i-1])*(SS(x,y)))%mod;
}
return res;
}
int n,m;
int main(){
freopen("bzoj_2693.in","r",stdin);
freopen("bzoj_2693.out","w",stdout);
init();
int T=read();
while(T--){
n=read();m=read();
printf("%d\n",(calc(n,m)+mod)%mod);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: