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})
O(n1.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剩下的题先放放吧。