补题*总结题21/8/25

总结

data不能用于bool数组变量名字,提交oj可能会报错...(求心里阴影面积)

全排列函数:next_permutation(s.begin(), s.end());

C - Coprime 2

AtCoder abc215_d
题意:
给出n个数,在[1,m]范围那找出与这n个数都互质的数。

思路1:

直接暴力,结果不出所料
时间复杂度O(n* m),直接超时
代码:

展开源码


int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a% b);
}
int main()
{
    int i,j;
    int n,m;
    cin>>n>>m;
    int a[100001];
    for(i=0; i>a[i];
    int data[100001];
    long long int o=0;
    long long  int sum;
    o=0;
    for(j=1; j<=m; j++)
    {
        if(gcd(j,a[0])==1)
        {
            data[o]=j;
            o++;
        }
    }
    sum=o;

    for(i=1; i< n ;  i++)
    {
        for(j=0; j < o; j++)
        {
            if( data[j]!=-1)
            {
                if( gcd(data[j],a[i])!=1 )
                {
                    data[j]=-1;
                    sum--;
                }
            }
        }
    }

    cout<< sum << endl;
    for(i=0 ; i< o;  i++)
    {
        if(data[i]!=-1)
            cout<< data[i]<< endl;
    }
    return 0;

}

思路2

做数组data[m],其中data[j]=0代表数j符合题意,data[j]=1代表不符合题意。
判断a[i]是否为质数,如果是质数则把1~m之间的a[i]的倍数赋值为1;
若不为质数,则把a[i]的质因数,在1~m之间的倍数赋值为1
代码:

**#include <bits/stdc++.h>
using namespace std;


int main()
{
    int i,j;
    int n,m;
    cin>>n>>m;
    int a[100001];
    for(i=0; i<n; i++)   cin>>a[i];
    int data[100001]= {0};
    int sum=m;
    int flag=0;
    int k;
    for(i=0; i<n; i++)
    {
        flag=0;//默认是质数
        if(a[i]==1){flag=1;}
        else
        if(a[i]==2||a[i]==3)
         {
             flag=0;
         }
        else
        {
            for(j=2; j*j<=a[i]; j++)
            {
                if(a[i]%j==0)
                {
                    flag=1;
                     for(k=1;j*k<=m;k++)
                     {
                         if(data[k*j]!=1)
                         {data[k*j]=1;
                         sum--;}
                     }
                    for(k=1;(a[i]/j)*k<=m;k++)
                     {
                         if(data[k*(a[i]/j)]!=1)
                         {data[k*(a[i]/j)]=1;

                         sum--;}
                     }
                }

            }
        }
        if(flag==0)
        {
            for(k=1;a[i]*k<=m;k++)
            {
                if(  data[ a[i]*k ]!=1)
                {data[ a[i]*k ]=1;
                sum--;
                }
            }
        }

    }



    cout<<sum<<endl;
    for(i=1; i<=m; i++)
    {
        if(data[i]==0)
            cout<<i<<endl;
    }
    return 0;

}
**

结果还是超时,但是比暴力快,继续优化。

思路3

思路2超时,应该是因为有公共质因数,重复给data[j]赋值导致,尝试在原函数上修改无果后,开启思路三

可以先把质因数找好标记上 ,然后,那么将不互质的数剔除。

代码:


#include<bits/stdc++.h>
using namespace std;
int ans[1000001];
bool ok[1000001]; //记录质因数
int check(int a)
{
    if(ok[a]==true)//如果i是质因数
    {
        return false;
    }
    for(int i=2; i*i<=a; i++)
    {
        if(a%i==0&&(ok[i]==true||ok[a/i]==true))
            return false;
    }
    return true;
}
int main()
{
  //下面是输入
    int n,m;
    cin>>n>>m;
    int p;
	
    for(int i=1; i<=n; i++)
    {

        cin>>p;
 //获取p的质因数
        for(int j=1; j*j<=p; j++)
        {
            if(p%j==0)
		{
		ok[j]=ok[p/j]=true;
		}
        }
      //获取p的质因数
    }
    int len=0;
    for(int i=2; i<=m; i++)
    {
        if(check(i))
        {
            len++;
            ans[len]=i;
        }
    }

    cout<<len+1<<endl<<1<<endl;
    for(int i=1; i<=len; i++)
        cout<<ans[i]<<endl;
    return 0;
}

B - One More aab aba baa

AtCoder - abc215_c

题意:给一个字符串,求该字符串按字典从小到大排序第K个串是什么
思路:
排序,找到按字典排序最小的串,全排列K次
代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    int k;
    cin >> s >> k;

    sort(s.begin(), s.end());
    for (int i = 0; i < k - 1; ++i)
    next_permutation(s.begin(), s.end());

    cout << s << '\n';

    return 0;
}

log2(N)

AtCoder abc215_b
题意:求log2(N)

疑问

  • -不知道为什么直接log(n)/log(2);到后面会Wrong Answer

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long  n;
     cin>>n;
    int i;
    long long t=1;
    for(i=0;i<=100;i++)
    {
        t*=2;
        if(t>n)
        {
            break;
        }
    }
    cout<<i<<endl;

    return 0;

}
posted @ 2021-08-25 19:47  kingwzun  阅读(26)  评论(0编辑  收藏  举报