一道简单的C++问题,程序是对的,但是运行太慢,求优化

#include<iostream>usingnamespacestd;intmain(){intm,n,k=0,i,j,count;while(cin>>m>>n){k... #include<iostream>
using namespace std;
int main()
{
int m,n,k=0,i,j,count;
while(cin>>m>>n){
k++;
printf("Case %d:",k);
count=m;
for(i=2;i<=m;i++){
for(j=2;j<=i;j++)
if((i%j==0&&n%j==0)||i%n==0){
count--;
break;
}
}
cout<<count<<endl;
}
return 0;
}
展开
 我来答
gj980603
推荐于2016-11-19 · TA获得超过194个赞
知道小有建树答主
回答量:187
采纳率:0%
帮助的人:168万
展开全部
#include <iostream>
using namespace std;

int gcd(int a, int b)
{
    if (!b)
        return a;
    else
        return gcd(b, a % b);
}

int main()
{
    int m,n,k=0,count;
    while (cin >> m >> n)
    {
        k++;
        printf("Case %d:", k);
        count = m;
        for (int i = 2; i <= m; i++)
        {
            if (gcd(i, n) != 1 || gcd(i, n) == n)
                --count;
        }
        cout<<count<<endl;
    }
    return 0;
}

以上代码做到了O(m*logn)

如果希望时间效率更优秀的话,用容斥原理可以做到O(k*2^k),其中k是m的质因子个数

容斥原理的代码我也贴上来吧

#include <iostream>

using namespace std;

typedef long long LL;
const int maxn = 50;

LL prime[maxn];
LL make_ans(LL num, int m)
{
LL ans = 0, tmp, flag;
for (int i = 1; i < (LL)(1 << m); i++)
{
tmp = 1, flag = 0;
for (int j = 0; j < m; j++)
if (i & ((LL)(1 << j)))
flag++, tmp *= prime[j];
if (flag & 1)
ans += num / tmp;
else
ans -= num / tmp;
}
return num - ans;
}

int main()
{
    int m, n, k = 0, count;
    while (cin >> m >> n)
    {
        k++;
        printf("Case %d:", k);

        int M = 0, flag = (n == 1);
        for (int i = 2; i * i <= n; i++)
if (n && n % i == 0)
{
prime[M++] = i;
while (n && n % i == 0)
n /= i;
}
        if (n > 1)
prime[M++] = n;
        count = (flag ? 1 : make_ans(m, M));
        cout << count << endl;
    }
    return 0;
}
追问
谢谢
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式