codevs 2964公共素数因数

2964 公共素数因数

时间限制: 1 s

空间限制: 32000 KB

题目等级 : 白银 Silver

题解

题目描述 Description

小单同学刚学习了一个数分解成几个素数(也叫质数)因子相乘的知识。

例如:12=2*2*3;25=5*5;144=2*2*2*2*3*3······等,比如,第一个表达式,说明12这个整数可以分解出2、2、3这三个质数因子。老师给他布置了一个作业,小单看来看去,怎么都不会做,只好虚心求教各位同学(他自己睡觉去了!)

问题是这样的:已知两个正整数a,b;请问a,b相同的素(质)因子有几个。请输出个数。例如:12与144 相同的素(质)因子为2,2,3;则输出3。12与25 相同的素(质)因子没有;则输出0。

输入描述 Input Description

第一行两个数:a,b,中间用一个空格分隔。

输出描述 Output Description

一个整数,表示a和b相同的素(质)因子个数。

样例输入 Sample Input

12  144

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

对于50%的数据,保证2≤a,b≤100

对于100%的数据,保证2≤a,b≤10000

syq命题。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b;
int a1[10001],b1[10001];
int ans=0;
int p1,p2;
bool s1[10001],s2[10001];
int shai(int x)//判断是否为素数
{
    if(x==2) return 1;
    for(int i=2;i<=sqrt(x);i++)
      if(x%i==0) return 0;
}
int main()
{
    cin>>a>>b;
    for(int i=2;i<=a;i++)
    {
        if(a==1) break;//到1之后就对答案没贡献了(MOD不了了)
        while(a%i==0)
      {
          if(shai(i))
          a1[++p1]=i,a/=i;//
      }
    }

    for(int i=2;i<=b;i++)
    {
        if(b==1) break;
        while(b%i==0)
      {
          if(shai(i))
          b1[++p2]=i,b/=i;
      }
    }
    for(int i=1;i<=p1;i++)
      for(int j=1;j<=p2;j++)
        if(a1[i]==b1[j]&&!s1[i]&&!s2[j])//判重
        {
            s1[i]=1;
            s2[j]=1;
            ans++;
        }

    printf("%d",ans);
    return 0;
}
时间: 2025-01-07 23:40:09

codevs 2964公共素数因数的相关文章

codevs 2945 计算素数

题目描述 Description 计算[A,B](区间包括A和B,2<=A<=B<=18000000)之间,一共有多少素数? 输入描述 Input Description 一行两个数A和B 输出描述 Output Description 一个数,表示素数的个数 样例输入 Sample Input 3 10 样例输出 Sample Output 3 数据范围及提示 Data Size & Hint 2<=A<=B<=18000000 思路: 素数筛+枚举 代码:

codevs:2849 素数判定 3:输入一个正整数x(3&lt;=x&lt;=100000),判断x是否是质数,如果是质数则输出信息“prime”,否则输出“composite”。

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int a[2];int main(){ int p,b=0,flag=1; scanf("%d",&p); for(int i=2;i<=p/2;i++) { if(p%i==0) { printf("composite"); return 0; } } printf("

codevs:1462 素数和:给定2个整数a,b 求出它们之间(不含a,b)所有质数的和。

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int main(){ int flag=0,a,b,tot=0; scanf("%d%d",&a,&b); if(a>b)swap(a,b); for(int i=a+1;i<b;++i) { flag=1; for(int j=2;j<=sqrt(i);++j) { if(i%

素数相关?(有关素数的题持续更新中)x

素数(大体举几个栗子): 素数相关知识: 素数概念: 最大公约数只有1和它本身的数叫做质数(素数) 素数小性质: 1.大于一的整数必有素因数. 2.设p是素数,n是任意一个整数 能够推出p|n,(p,n)=1; 3.设p是素数,a,b为整数,若p|ab,则ab中至少有一个能被p整除 4.素数有无穷多个证明: (素数与整数之间的关系:1整除2互素) 假定正整数中只有有限个素数 设p1,p2……pk为从小到大排列起来的数 且N=p1*p2*……pk 设M=N+1 如果M为素数,那么M要大于p1,p2

素数推断算法(高效率)

chuanbindeng 的 素数推断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法.看了以后相信 对大家一定有帮助. 正如大家都知道的那样,一个数 n 假设是合数,那么它的全部的因子不超过sqrt(n)--n的开方,那么我们能够用这个性质用最直观的方法 来求出小于等于n的全部的素数. num = 0; for(i=2; i<=n; i++) {  for(j=2; j<=sqrt(i); j++) if( j%i==0 ) b

素数判定相关资料

素数(质数)的判定 (1)最基本素数判定方法大家熟悉,只用看看2到n(或n的平方根)之间有没有n的约数: #include<stdio.h> void main() { int i,n; scanf("%d",&n); for(i=2;i<n;i++) if(n%i==0)break; if(i<n||n==1)puts("No"); else puts("Yes"); } 此方法适用于判定较少数,数据量大时会超时

模板小程序】求小于等于N范围内的质数

xiaoxi666 联系邮箱: [email protected] 博客园 首页 新随笔 联系 订阅 管理 [模板小程序]求小于等于N范围内的质数 1 //筛法求N以内的素数(普通法+优化),N>=2 2 #include <iostream> 3 #include <cmath> 4 #include <vector> 5 using namespace std; 6 ///寻找N以内的质数 7 vector<int> find_Prime(int

【模板小程序】求小于等于N范围内的质数

1 //筛法求N以内的素数(普通法+优化),N>=2 2 #include <iostream> 3 #include <cmath> 4 #include <vector> 5 using namespace std; 6 ///寻找N以内的质数 7 vector<int> find_Prime(int N) 8 { 9 vector<int> prime_tmp(N,1); 10 for(int i=0; 2*i+3<=sqrt(

Codeforces Round #162 (Div. 1) B dp

//存入所有数的素数因数 //若两个数不互质,那么他们之间必然有素数因数 //dp[i][0]表示第i个数不选前i个数中能得到的最长序列 //dp[i][1]表示选了第i个数 //dp[i][0] = max(dp[i-1][0] , dp[i-1][1]) //dp[i][1] = max(dp[pos][1] + 1 ,dp[i][1] ); //pos位第i个数的质数因子出现的最后一个位置 #include<cstdio> #include<cstring> #include