hdu2841 (容斥原理递归版)

来源:互联网 发布:奢侈品软件 编辑:程序博客网 时间:2024/04/29 16:18

题意:给整数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-8typedef 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;}

0 0
原创粉丝点击