Redraiment猜想2 (容斥)

来源:互联网 发布:人工智能的利弊800字 编辑:程序博客网 时间:2024/06/04 01:08

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=557


我还不知道容斥原理是什么(别人博客是这么说的),感觉很厉害.

开始发这博客的时候只是似懂非懂,现在补充一下我的理解。

1、为什么要素数表达到10005因为,在10^8内的所有合数必然至少有一个约数在10005以内。

2、素数表。

3、dfs中的容斥,多减少补。


#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <map>#include <cmath>#include <iostream>#include <stdexcept>#include <cstddef>#include <algorithm>#include <vector>#include <numeric>#include <cctype>#define LL long long#define Endl endl#define INF 0x7fffffff//#define WJusing namespace std;const int maxn=10005;int n,sqrn,cnt;bool vis[maxn];int p[1300];void prime(){int k=0;for(int i=2;i<maxn;i++){if(!vis[i]) p[k++]=i;for(int j=0;j<k&&p[j]*i<maxn;j++){vis[p[j]*i]=1;if(i%p[j]==0) break;}}}void dfs(int num,int pro,int index){for(int i=index;p[i]<=sqrn;i++){if(1LL*pro*p[i]>n) return;dfs(num+1,pro*p[i],i+1);if(num&1) cnt-=n/(pro*p[i]);else cnt+=n/(pro*p[i]);if(num==1) cnt++;}}int main(int argc, char *argv[]){#ifdef WJ//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifmemset(vis,0,sizeof(vis));prime();while(scanf("%d",&n),n){cnt=n;sqrn=int(sqrt((double)n)+0.5);dfs(1,1,0);printf("%d\n",cnt-1);}return 0;}


0 0
原创粉丝点击