BZOJ 2693 jzptab(莫比乌斯反演)
2016-08-03 09:48
225 查看
Description
求
Input
一个正整数T表示数据组数,接下来T行每行两个正整数表示N和M
(T<=10000,N,M<=10000000)
Output
T行,每行一个整数表示第i组数据的结果
Sample Input
1
4 5
Sample Output
122
Solution
Code
求
Input
一个正整数T表示数据组数,接下来T行每行两个正整数表示N和M
(T<=10000,N,M<=10000000)
Output
T行,每行一个整数表示第i组数据的结果
Sample Input
1
4 5
Sample Output
122
Solution
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define maxn 11111111 #define mod 100000009 typedef long long ll; bool check[maxn]; int prime[maxn]; ll f[maxn],sum[maxn]; void Moblus(int n) { memset(check,0,sizeof(check)); f[1]=sum[1]=1; int tot=0; for(int i=2;i<=n;i++) { if(!check[i]) { prime[tot++]=i; f[i]=(i-1ll*i*i)%mod; } for(int j=0;j<tot;j++) { if(i*prime[j]>n)break; check[i*prime[j]]=1; if(i%prime[j]==0) { f[i*prime[j]]=(prime[j]*f[i])%mod; break; } f[i*prime[j]]=(f[prime[j]]*f[i])%mod; } sum[i]=(sum[i-1]+f[i])%mod; } } ll Sum(int x,int y) { return (1ll*x*(x+1)/2%mod)*(1ll*y*(y+1)/2%mod)%mod; } ll solve(int x,int y) { if(x>y)swap(x,y); ll ans=0; for(int i=1,next=0;i<=x;i=next+1) { next=min(x/(x/i),y/(y/i)); ans=(ans+(sum[next]-sum[i-1])*Sum(x/i,y/i)%mod+mod)%mod; } return ans; } int main() { Moblus(maxn-10); int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); printf("%lld\n",solve(n,m)); } return 0; }
相关文章推荐
- 【BZOJ2693】jzptab(莫比乌斯反演)
- 【BZOJ2693】jzptab(莫比乌斯反演)
- 【BZOJ2693】jzptab(莫比乌斯反演)
- bzoj 2693 jzptab 莫比乌斯反演
- bzoj 2693 jzptab 莫比乌斯反演
- BZOJ_2693_jzptab_莫比乌斯反演
- BZOJ 2693 jzptab 莫比乌斯反演
- 【BZOJ2693】jzptab 莫比乌斯反演
- 【BZOJ2693】jzptab(莫比乌斯反演)(数学)
- [BZOJ2693]jzptab(莫比乌斯反演)
- BZOJ 2693 jzptab
- BZOJ 2154 + 2693 莫比乌斯反演 (好题
- BZOJ 2693 jzptab 莫比乌斯反演
- Bzoj2693 jzptab
- 【BZOJ】2693: jzptab 莫比乌斯反演
- BZOJ 2693 JZPTAB
- [BZOJ2693]jzptab
- 【bzoj2693】jzptab【反演】
- ●BZOJ 2693 jzptab
- Problem Eight:[Crash的数字表格/BZOJ2693 jzptab(多组)]