Atcoder 162 (A~E)

A
A题链接
水题
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;
int main()
{
    int n;
    cin>>n;
    int k=n/100;
    n=n%100;
    int c=n/10;
    int f=n%10;
    if(k==7||c==7||f==7)
    {
        cout<<"Yes"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }

    return 0;
}

B
B题链接
水题,根据题意模拟即可
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;
int main()
{
    int n;
    cin>>n;
    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        if(i%3==0||i%5==0)
        {
            continue;
        }
        sum+=i;
    }
    cout<<sum;
    return 0;
}

C
C题链接
题意求
在这里插入图片描述

范围较小直接暴力即可
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;

int gcd(int a,int b)
{
	return b==0?a:(gcd(b,a%b));
}
ll mapx[201][201];
int main()
{
    int n;
    cin>>n;
    ll sum=0;
    for(int k=1;k<=n;k++)
    {
        for(int j=1;j<=n;j++)
        {
            mapx[k][j]=gcd(k,j);
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int j=1;j<=n;j++)
        {
            for(int i=1;i<=n;i++)
            {
                int ans=mapx[k][j];
                sum+=mapx[ans][i];
            }
        }
    }
    cout<<sum;
    return 0;
}

D
D题链接
题意:给你一个字符串,这个字符串中只有R,G,BR,G,BR,G,B。让你找三元组(i,j,k)(i,j,k)(i,j,k)的数量,满足
i 并且s[i]!=s[j],s[i]!=s[k],s[j]!=s[k]s[i]!=s[j],s[i]!=s[k],s[j]!=s[k]s[i]!=s[j],s[i]!=s[k],s[j]!=s[k]
解析:求出R,G,B的数量x,y,z总数即为xyz减去不符合条件的
枚举间距i。j,j+i,j+2*i两两不同则总数减一
AC代码:

#include
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include 
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
char a[5000];
ll x,y,z;

int main()
{
     int n,k;
     cin>>n;
     for(int i=0;i<n;i++)
     {
         cin>>a[i];
         if(a[i]=='R')
         {
             x++;
         }
         else if(a[i]=='G')
         {
             y++;
         }
         else
         {
             z++;
         }
     }
     ll ans=x*y*z;
     for(int i=0;i*2<n;i++)
     {
         for(int j=0;j+2*i<n;j++)
         {
             if(a[j]!=a[j+i]&&a[j+i]!=a[j+2*i]&&a[j]!=a[j+2*i])
             {
                 ans--;
             }
         }
     }
     cout<<ans<<endl;
    return 0;
}

E
E题链接
题意:给你n个数,然后每个数的范围为[1,k]。让你求这个序列所有可能的情况时gcd的和k
解析:容斥原理。f[i]为公约数为i的数量。最大公约数为i即N个数均为I的倍数,则有k/i个数。共有(k/i)^n种情况,但是这里面都重复的,最大公约数为2i,3i,4*i…,我们要减去这些序列的数量。所以我们倒着枚举最大公约数就很好处理了。
AC代码:

#include
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include 
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
#define pi 3.1415926535898
using namespace std;
ll f[200010];
const ll mod = 1e9+7;
ll x,y,z;
ll pows(int n,int a)//快速幂
{
    ll ans=1;
    while(a)
    {
        if(a&1)
        {
            ans=1ll*ans*n%mod;
        }
        n=1ll*n*n%mod;
        a>>=1;
    }
    return ans;
}
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=k;i>=1;i--)
    {
        f[i]=pows(k/i,n);
        for(int j=2*i;j<=k;j+=i)//容斥
        {
            f[i]=(f[i]-f[j]+mod)%mod;
        }
    }
    ll ans=0;
    for(int  i=1;i<=k;i++)
    {
        ans+=1ll*i*f[i]%mod;//大小乘以个数才等于和
        ans%=mod;
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(Atcoder)