A
给你一个区间 ,请你找出两个数,a,b使得a mod b最大。
签到题, r%(r/2+1) 的值一定最大。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=100010; #define endl '\n' int a[N]; int main(){ int T; cin>>T; while(T--){ int x,y; cin>>x>>y; //if(x>y) swap(x,y); int t=(y)/2+1; if(t<x){ cout<<y-x<<endl; } else{ if(y%2==0) cout<<y/2-1<<endl; else cout<<y/2<<endl; } } }
B
给你一个n位的整数,问你最多能删除多少位,让他变成非质数,1也是非质数,输出删除后的位数,和数字。
思路:
包含,1,4,6,8,9这样的直接输出就行了,而如果只包含质数2,3,5,7;特判25,27,32,35,57,75,72;
如果2,3,5,7中有一个数的个数大于2,则输出类似于22,33,55,77;
代码:
#include <bits/stdc++.h> using namespace std; #define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0) #define sc(x) scanf("%d",x) typedef long long ll; typedef unsigned long long ull; typedef long double ld; inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; } ll qpow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll qpow(ll a, ll b, ll mod) { ll ans = 1; a%=mod; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; } inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } const int mod=1e9+7; const int N=1e5+7; int k; ll n; string s; void fun(){ cin>>k>>s; for(int i=0;i<k;i++){ if((s[i]=='1'||s[i]=='4'||s[i]=='6'||s[i]=='8'||s[i]=='9')){ cout<<1<<endl; cout<<s[i]<<endl; return; } } for(int i=0;i<k-1;i++){ for(int j=i+1;j<k;j++){ if(s[i]==s[j]){ cout<<2<<endl; cout<<s[i]<<s[i]<<endl; return; } if(s[i]=='2'&&s[j]=='5'||s[i]=='2'&&s[j]=='7'||s[i]=='3'&&s[j]=='2'||s[i]=='3'&&s[j]=='5'||s[i]=='5'&&s[j]=='2'||s[i]=='5'&&s[j]=='7'||s[i]=='7'&&s[j]=='2'||s[i]=='7'&&s[j]=='5'){ cout<<2<<endl; cout<<s[i]<<s[j]<<endl; return; } } } } int main(){ int t; cin>>t; while(t--){ fun(); } return 0; }
补题
C
题目意思大概应该是,给你一个二进制字符串,然后你要选两段区间,这两个区间不能相同,把选到的两端区间里的字符串转化成10进制整数,假设t,w然后,t=w*k,两个区间长度都必须大于n/2,向下取整。
思路:
下标从0开始,思考的太慢了,其实很容易懂,
1.例:111他的两倍是1110,所以后半段有0我们可以直接构造两倍的关系
2.那前半段有0,例:0111 和 111其实是相等的,这就很好办了。
3.全是1,乱输出
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=10000; #define endl '\n' int a[N],n; string s; //下标从0开始,思考的太慢了,其实很容易懂, //1.例:111他的两倍是1110,所以后半段有0我们可以直接构造两倍的关系 //2.那前半段有0,例:0111 和 111其实是相等的,这就很好办了。 //3.全是1,乱输出 void solve(){ cin>>n; cin>>s; for(int i=0;i<n;i++){ if(s[i]=='0'){ if(i>=n/2){ cout<<1<<" "<<i+1<<" "<<1<<" "<<i<<endl; return; } else{//10110011 cout<<i+2<<" "<<n<<" "<<i+1<<" "<<n<<endl; return; } } } cout<<1<<" "<<n-1<<" "<<2<<" "<<n<<endl; } int main(){ int T; cin>>T; while(T--){ solve(); } }
D1
给你一个字符串,‘+’ 表示正电荷 ‘-’ 表示负电荷,即 + 表示1, - 表示-1;当i为偶数是当前位取反,给你q个询问,每一个询问一个区间问最少删除几个字符最后 电荷为0,
瞎猜的
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2000010; #define endl '\n' int a[N],n; string s; void solve(){ int q; cin>>n>>q; cin>>s; s=" "+s; for(int i=1;i<=n;i++){ int c=s[i]=='+' ?1:-1; if(i&1) c=-c; a[i]=a[i-1]+c; } while(q--){ int l,r; cin>>l>>r; int len=r-l+1; if(a[r]-a[l-1]==0){ cout<<0<<endl; } else{ if(len&1) cout<<1<<endl; else cout<<2<<endl; } } } int main(){ int T; cin>>T; while(T--){ solve(); } }