第一行包括一个正整数T(T<=1000),表示T组数据。
接下来T行,每行包括3个正整数L,R,x。
1≤L≤R≤10^18
1≤x≤10^18
输出T行,每一行一个整数,表示答案。
1 2 5 3
1
解题思路:水!
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL T,L,R,x; 5 int main(){ 6 while(cin>>T){ 7 while(T--){ 8 cin>>L>>R>>x; 9 cout<<R/x-(L-1)/x<<endl; 10 } 11 } 12 return 0; 13 }
第一行包括2个正整数n,k(1≤n≤10^5,1≤k≤10^6),表示有n种怪物,一天有k分钟。
接下来一行包括n个正整数X(1≤Xi≤10^6),含义如题面所示。
输出一行,包括两个整数a,b。
a表示怪物种类数,b表示时间点的个数。
3 6 2 2 3
3 1
在第6分钟时,3种怪物都出现了。
3 5 2 2 3
2 2
在第2分钟和第4分钟时,第一种和第二种怪物出现了。
6 10 1 2 3 4 5 6
4 1
在第6分钟时,出现了第一种、第二种、第三种、第六种怪物。
3 5 6 6 6
0 5
在第1分钟、第2分钟、第3分钟、第4分钟、第5分钟,都没有出现怪物。
解题思路:埃氏筛nlogn暴力过。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn=1e6+5; 5 int n,k,x,maxxx,cnt[maxn],ans1[maxn],ans2[maxn]; 6 int main(){ 7 while(~scanf("%d%d",&n,&k)){ 8 memset(cnt,0,sizeof(cnt)); 9 memset(ans1,0,sizeof(ans1)); 10 memset(ans2,0,sizeof(ans2));maxxx=0; 11 for(int i=0;i<n;++i)scanf("%d",&x),cnt[x]++; 12 for(int i=1;i<=k;++i){ 13 if(!cnt[i])continue; 14 for(int j=i;j<=k;j+=i) 15 ans1[j]+=cnt[i];///统计每个时间点的怪物种类数 16 } 17 for(int i=1;i<=k;++i)maxxx=max(maxxx,ans1[i]),ans2[ans1[i]]++;///最大种类数出现的时间点个数 18 printf("%d %d\n",maxxx,ans2[maxxx]); 19 } 20 return 0; 21 }
原文:https://www.cnblogs.com/acgoto/p/10086227.html