标签:输出 正整数 11.4 am 样例 int 测试 include divisors
题目描述
给定m 个不同的正整数a1,a2,.... am,请对0 到m 每一个k 计算,在区间[1, n] 里有多少正整数
是a 中恰好k 个数的约数。
输入
第一行包含两个正整数n,m,分别表示区间范围以及a 数组的大小。
第二行包含m 个不同的正整数a1,a2,.... am,表示a 数组。
输出
输出m + 1 行,每行一个整数,其中第i 行输出k = i 的答案。
样例输入
10 3
4 6 7
样例输出
4
4
1
1
数据范围
m<=200,n<=10^9,ai<=10^9
题解:emmm数论大法好,注意0的情况由所有情况推过来即可。
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> using namespace std; const int N=1e7+2; int ans[N],n,m,xx,c[N],cnt; void Yao_Chen(int x){ for(int i=1;i*i<=x;i++){ if(x%i==0){ c[++cnt]=x/i; c[++cnt]=i; } if(i*i==x) cnt--; } } int main(){ freopen("div.in","r",stdin); freopen("div.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d",&xx); Yao_Chen(xx); } sort(c+1,c+cnt+1); int last=c[1],sum=1,ps=0; for(int i=2;i<=cnt && c[i]<=n;i++){ if(c[i]!=last) { ans[sum]++; last=c[i]; sum=1; } else sum++; } ans[sum]++; for(int i=1;i<=m;i++) ps+=ans[i]; printf("%d\n",n-ps); for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }
标签:输出,正整数,11.4,am,样例,int,测试,include,divisors 来源: https://www.cnblogs.com/wuhu-JJJ/p/11792901.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。