hdu2841(容斥原理)

来源:互联网 发布:新三板最新数据 编辑:程序博客网 时间:2024/05/16 07:27

http://acm.hdu.edu.cn/showproblem.php?pid=2841

参考:http://www.cnblogs.com/kane0526/archive/2013/03/14/2795446.html

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <queue>#include <math.h>#include <algorithm>using namespace std;#define N 100005long long q[N];vector<int>vt[N];void init(){    for(int i=0;i<N;i++) vt[i].clear();    for(int i=2;i<N;i++){        int t=i;        for(int j=2;j*j<=i;j++) if(t%j==0){            vt[i].push_back(j);            while(t%j==0) t/=j;        }//for_j        if(t>1) vt[i].push_back(t);    }//for_i}//initlong long cal(int n,int s){    int num=0;    q[num++]=1;    for(int i=0;i<vt[s].size();i++){        int ep=vt[s][i];        if(ep>n) break;        int k=num;        for(int j=0;j<k;j++) q[num++]=q[j]*ep*(-1);    }    long long sum=0;    for(int i=0;i<num;i++) sum+=n/q[i];    return sum;}//calint main(){    int m,n,T;    init();    scanf("%d",&T);    while(T--){        scanf("%d%d",&n,&m);        long long ans=n;        for(int i=2;i<=m;i++) ans+=cal(n,i);        printf("%lld\n",ans);    }//while    return 0;}


0 0
原创粉丝点击