题意:给整数m,n;(m,n<=100000).题意可以转化为求(1-m,1-n)的组合中,有多少对数互质。
解法:先线性筛素数法筛出100000之内每个数的质因子,然后容斥求1-n中有多少个数和i互质。
dfs(int i,int tool,int rem)表示的意思是:1-tool中含有rem位置之后的i的质因子的数的个数。
代码:
/**************************************************** * author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <string.h> using namespace std; #define eps 1e-8 typedef long long LL; int num[100100][25]; int m,n; void init() { for(int i=2;i<=100000;i++) { if(num[i][0]==0) { num[i][1]=i; num[i][0]=1; for(int j=i*2;j<=100000;j+=i) num[j][++num[j][0]]=i; } } } long long dfs(int i,int tool,int rem) { long long res=0; for(int j=rem;j<=num[i][0];j++) res+=tool/num[i][j]-dfs(i,tool/num[i][j],j+1); return res; } int main() { int t=0; cin>>t; init(); while(t--) { cin>>m>>n; long long ans=0; for(int i=1;i<=m;i++) ans+=n-dfs(i,n,1); cout<<ans<<endl; } return 0; }
hdu2841 (容斥原理递归版),布布扣,bubuko.com
原文:http://blog.csdn.net/xiefubao/article/details/23462371