首页 > 代码库 > Bzoj2693 jzptab
Bzoj2693 jzptab
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1436 Solved: 568Description
Input
一个正整数T表示数据组数
接下来T行 每行两个正整数 表示N、M
Output
T行 每行一个整数 表示第i组数据的结果
Sample Input
1
4 5
4 5
Sample Output
122
HINT
T <= 10000
N, M<=10000000
HINT
T <= 10000
N, M<=10000000
HINT
Source
版权所有者: 倪泽堃
数学问题 莫比乌斯反演
终于会筛积性函数啦——
似乎以前的理解有一部分想岔了……
在Bzoj2154的基础上再推几步就能get $O(sqrt(n))$ 的算法
因为很困所以不写题解了233
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 #define LL long long 9 using namespace std;10 const int mod=1e8+9;11 const int mxn=1e7+3;12 int read(){13 int x=0,f=1;char ch=getchar();14 while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}15 while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}16 return x*f;17 }18 int pri[mxn],cnt;19 LL g[mxn],smm[mxn];20 bool vis[mxn];21 void init(){22 g[1]=1;23 for(int i=2;i<mxn;i++){24 if(!vis[i]){25 pri[++cnt]=i;26 g[i]=1-i;27 }28 for(int j=1;j<=cnt && (LL)pri[j]*i<mxn;j++){29 vis[pri[j]*i]=1;30 if(i%pri[j]==0){31 g[pri[j]*i]=g[i];32 break;33 }34 g[pri[j]*i]=g[i]*g[pri[j]]%mod;35 }36 }37 for(int i=1;i<mxn;i++)38 smm[i]=(smm[i-1]+g[i]*i%mod)%mod;39 return;40 }41 inline int SS(int x,int y){42 return ((LL)x*(x+1)/2%mod)*((LL)y*(y+1)/2%mod)%mod;43 }44 LL calc(int n,int m){45 if(n>m)swap(n,m);46 LL res=0;int pos;47 for(int i=1;i<=n;i=pos+1){48 int x=n/i,y=m/i;49 pos=min(n/x,m/y);50 res=(res+(smm[pos]-smm[i-1])*(SS(x,y)))%mod;51 }52 return res;53 }54 int n,m;55 int main(){56 freopen("bzoj_2693.in","r",stdin);57 freopen("bzoj_2693.out","w",stdout);58 init();59 int T=read();60 while(T--){61 n=read();m=read();62 printf("%d\n",(calc(n,m)+mod)%mod);63 }64 return 0;65 }
Bzoj2693 jzptab
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。