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(n1.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;//相当于乘kcout<<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剩下的题先放放吧。