当前位置:   article > 正文

备战蓝桥杯---数学刷题3

备战蓝桥杯---数学刷题3

话不多说,直接看题:

1.

我们可以得到大致一个思路,就是先枚举1-1e6的质数,然后看看有几个即可。

我们怎么知道个数呢?

首先我们知道1---n中有n/p的下取整个为p的倍数。

因此,p的个数至少是n/p的下取整个,当然有些数有不止1个p的倍数,于是我们得到n/p^2+n/p^3+...直到p^i>n.

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1000010;
  4. int pri[N],cnt;
  5. bool st[N];
  6. void getpri(int n){
  7. for(int i=2;i<=n;i++){
  8. if(!st[i]) pri[cnt++]=i;
  9. for(int j=0;pri[j]*i<=n;j++){
  10. st[pri[j]*i]=1;
  11. if(i%pri[j]==0) break;
  12. }
  13. }
  14. }
  15. int main(){
  16. int n;
  17. cin>>n;
  18. getpri(n);
  19. for(int i=0;i<cnt;i++){
  20. int p=pri[i];
  21. int s=0,t=n;
  22. while(t){
  23. s+=t/p;
  24. t/=p;
  25. }
  26. printf("%d %d\n",p,s);
  27. }
  28. }

2.

我们把数按照基本算数定理拆分,我们对于每一个质数的奇数,答案就乘这个,若为偶数,那么就不用管,下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. int main(){
  5. LL n;
  6. cin>>n;
  7. LL res=1;
  8. for(LL i=2;i*i<=n;i++){
  9. if(n%i==0){
  10. int s=0;
  11. while(n%i==0){
  12. s++;
  13. n/=i;
  14. }
  15. if(s%2) res*=i;
  16. }
  17. }
  18. if(n>1) res*=n;
  19. cout<<res;
  20. }

3.

下面是分析:

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int gcd(int a,int b){
  4. return b?gcd(b,a%b):a;
  5. }
  6. int T,a0,a1,b0,b1;
  7. int ans;
  8. int main(){
  9. cin>>T;
  10. while(T--){
  11. ans=0;
  12. scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
  13. int p1=a0/a1,p2=b1/b0;
  14. for(int i=1;i*i<=b1;i++){
  15. if(b1%i) continue;
  16. if(i%a1==0&&gcd(i/a1,p1)==1&&gcd(b1/i,p2)==1) ans++;
  17. if(i==b1/i) continue;
  18. int ck=b1/i;
  19. if(ck%a1==0&&gcd(ck/a1,p1)==1&&gcd(b1/ck,p2)==1) ans++;
  20. }
  21. printf("%d\n",ans);
  22. }
  23. }

4.

这里主要介绍一个定理:求两个数的约数等价于最大公约数的因子,于是我们求出gcd,然后求约数即可,下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int q[5000],cnt;
  4. int gcd(int a,int b){
  5. return b?gcd(b,a%b):a;
  6. }
  7. int main(){
  8. int a,b;
  9. cin>>a>>b;
  10. int d=gcd(a,b);
  11. for(int i=1;i<=d/i;i++){
  12. if(d%i==0){
  13. q[cnt++]=i;
  14. if(i!=d/i) q[cnt++]=d/i;
  15. }
  16. }
  17. sort(q,q+cnt);
  18. int n;
  19. cin>>n;
  20. while(n--){
  21. int L,R;
  22. scanf("%d%d",&L,&R);
  23. int f=0;
  24. for(int i=cnt-1;i>=0;i--){
  25. if(q[i]>=L&&q[i]<=R){
  26. printf("%d\n",q[i]);
  27. f=1;
  28. break;
  29. }
  30. }
  31. if(f==0) cout<<-1<<endl;
  32. }
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/404966
推荐阅读
相关标签
  

闽ICP备14008679号