AtCoder Beginner Contest 172总结

A-calc

直接按照题目输出就行

#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int a;
    cin>>a;
    cout<<a+a*a+a*a*a<<endl;
    return 0;
    
}
B-Minor Change

题中默认肯定能够从S替换到T那么直接不相等的位置替换

#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int res=0;
    string a,b;
    cin>>a>>b;
    for(int i=0;i<a.size();i++) res+=int(a[i]!=b[i]);
    cout<<res<<endl;
    return 0;
}

C-Tsundoku

前缀和+双指针
注意:最后一步枚举i一定要从0开始,可把我坑惨了!!!

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N],b[N];
int n,m;
ll k;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int res=0;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        a[i]+=a[i-1];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>b[i];
        b[i]+=b[i-1];
    }
    for(int i=0,j=m;i<=n;i++)//这里i一定要从0开始循环要不然会漏掉不在a数组中选数的情况
    {
        while(j&&a[i]>k-b[j]) j--;
        if(a[i]<=k-b[j]) res=max(res,i+j);
    }
    cout<<res<<endl;
    return 0;
}

就做了上面三个题太菜了-。-

D - Sum of Divisors

当时一看求质因数个数,就想到分解质因数求,发现复杂度 O ( n 1.5 ) O(n^{1.5}) 吃不消就没有然后了。。。
对于一个数,它是它倍数的因数,所以我们从1到N枚举一个数,加上它的所有倍数的和就可以算出答案了。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
int n;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    ll res=0;
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j+=i) res+=j;//相当于乘k
    cout<<res<<endl;
    return 0;
}

E - NEQ

这两天补了数学的知识,发现好像可以看懂题解了。容斥原理,如果确定A的情况,那么B的合法情况可以用所有情况除去不合法情况,不合法情况可以用容斥原理求,最后乘以A的合法情况就可以了。
PS:注意输出

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=500005,mod=1e9+7;
int n,m,fact[N],infact[N];
int qmi(int a,int k,int p)
{
    int res=1;
    while(k)
    {
        if(k&1) res=1ll*res*a%p;
        k>>=1;
        a=1ll*a*a%p;
    }
    return res;
}
void init()
{
    fact[0]=infact[0]=1;
    for(int i=1;i<=m;i++)
    {
        fact[i]=1ll*fact[i-1]*i%mod;
        infact[i]=qmi(fact[i],mod-2,mod);
    }
}
int main()
{
    IO;
    cin>>n>>m;
    init();
    ll res=0;
    for(int i=0;i<=n;i++)   
    {
        if(i&1) res=(res-1ll*fact[n]*infact[i]%mod*infact[n-i]%mod*fact[m-i]%mod*infact[m-n]%mod)%mod;
        else res=(res+1ll*fact[n]*infact[i]%mod*infact[n-i]%mod*fact[m-i]%mod*infact[m-n]%mod)%mod;
    }
    for(int i=m-n+1;i<=m;i++) res=res*i%mod;
    //cout<<res%mod<<endl;这样输出一直wa第8个测试数据要输出正数,这样输出由于c++内部原因可能输出负数
    res%=mod;
    cout<<(res+mod)%mod<<endl;
}

哎我tcl剩下的题先放放吧。

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/107004819