Codeforces Round #725 (Div. 3)部分题解
Posted KaaaterinaX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #725 (Div. 3)部分题解相关的知识,希望对你有一定的参考价值。
C
一眼过去就是二分,序列排序后对每个元素二分找出上下边界,加起来就可以了。
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
//#include <unordered_set>
#include <string.h>
#include <map>
//#include <unordered_map>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <deque>
#define YES "YES"
#define NO "NO"
#define INF 0x3f3f3f3f
#define FAST ios::sync_with_stdio(false)
#define ll long long
#define pb push_back
#define endl '\\n'
#define eps const double eps=1e-6
using namespace std;
const int maxn=2e5+7;
int num[maxn];
int main(){
int t;
cin>>t;
while(t--){
int n,l0,r0;
cin>>n>>l0>>r0;
for(int i=1;i<=n;i++){
cin>>num[i];
}
sort(num+1,num+1+n);//从小到大排序
//二分
ll ans=0;
for(int i=1;i<n;i++){
int l=i+1,r=n;
int t=num[i];
int tl=0,tr=0;
while(l<=r){
int mid=(l+r)>>1;
if(t+num[mid]<l0){
l=mid+1;
}
else{
tl=mid;
r=mid-1;
}
}
l=i+1;
r=n;
while(l<=r){
int mid=(l+r)>>1;
if(t+num[mid]>r0){
r=mid-1;
}
else{
tr=mid;
l=mid+1;
}
}
if(tr!=0&&tl!=0)
ans+=tr-tl+1;
}
cout<<ans<<endl;
}
}
D
这个想了一下下qaq,发现就是质因数分解,看每个数字最多能被整除多少次,与k比较就行了,另外要注意k=1特判。
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
//#include <unordered_set>
#include <string.h>
#include <map>
//#include <unordered_map>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <deque>
#define YES "YES"
#define NO "NO"
#define INF 0x3f3f3f3f
#define FAST ios::sync_with_stdio(false)
#define ll long long
#define pb push_back
#define endl '\\n'
#define eps const double eps=1e-6
using namespace std;
//---------------------------------------------------//
template<typename T>inline void read(T &x){
x=0;
char c=getchar();
ll f=1;
if(c>'9'||c<'0'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c<='9'&&c>='0'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
x*=f;
}
template<typename T> inline void write(T x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
}
//_____________________________________________________//
const int maxn=1e5+7;
int cnt=0;
bool vis[maxn];
int pri[maxn];
void Prime(){
for(int i=2;i<=maxn-7;i++){
if(!vis[i]){
pri[++cnt]=i;
}
for(int j=1;j<=cnt&&i*pri[j]<=maxn;j++){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
break;
}
}
}
}
int divid(int n){
int ss=sqrt(n);
int res=0;
for(int i=1;i<=cnt&&pri[i]<=ss;i++){
while(n%pri[i]==0){
res++;
n/=pri[i];
}
}
if(n!=1){
res++;
}
return res;
}
//int divid(int n){
// int res=0;
// for(int i=2;i<=n/i;i++){
// while(n%i==0){
// res++;
// n/=i;
// }
// }
// if(n>1){
// res++;
// }
// return res;
//}//用这个t了。。
int main(){
Prime();
int t;
cin>>t;
while(t--){
int a,b,k;
cin>>a>>b>>k;
int cnta=divid(a);
int cntb=divid(b);
// cout<<"cnta="<<cnta<<endl;
// cout<<"cntb="<<cntb<<endl;
if(k==1){
if(a!=b&&(a%b==0||b%a==0)){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
else{
if(cnta+cntb>=k){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
}
F
好短,好神奇,举了几个例子就看到规律了emm
大概就是分开看个位,十位…到最高位
#include<iostream>
#define ll long long
int main(){
int t;
cin>>t;
while(t--){
int l,r;
cin>>l>>r;
ll ans=0;
while(l!=0||r!=0){
ans+=r-l;
l/=10;
r/=10;
}
cout<<ans<<endl;
}
}
啊,毫无技术含量,发点div3的简单题水水访客量,呜呜。
以上是关于Codeforces Round #725 (Div. 3)部分题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)部分题解