8.12(打表+位运算+思维)
- codeforces
训练赛,我打的太菜了,没有想出来规律,队友还是很给力的,我们一起打也很快乐
A. chmod
字符串结合二进制,本来一两发就可以AC的,但是由于我的疏忽,忘记bitset的函数判断,导致多wa了几发,小难受
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e8+10;
const int MOD = 1e9 + 7;
int qpow(int a, int b, int m) {
int result = 1;
a %= m;
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return result;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Euler(100001);
int t;
cin >> t;
while (t--) {
string a;
cin>>a;
//cout<<a<<'\n';
for(int i=0;i<=2;i++){
string s="";
int cnt= a[i]-'0';
// cout<<cnt<<'\n';
bitset<3> bt;
bt=bitset<3>(cnt);
// cout<<bt<<'\n';
// cout<<bt[2];
// cout<<bt[1];
// cout<<bt[0]<<'\n';
bool pd=bt.test(2);
// cout<<pd<<'\n';
if (pd) {
s += 'r';
} else
s += '-';
pd = bt.test(1);
// cout<<pd<<'\n';
if (pd) {
s += 'w';
} else
s += '-';
pd = bt.test(0);
// cout<<pd<<'\n';
if (pd) {
s += 'x';
} else
s += '-';
cout<<s;
}
cout<<'\n';
}
return 0;
}
F. Try a try, AC is OK
签到题,找最大即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e8+10;
const int MOD = 1e9 + 7;
bool f[N];
int prime[N],tot=0;
int pre[N];
void Euler(int n) {
int ans=0;
f[0] = f[1] = 1;
for (int i = 2; i <= n; i++) {
if (!f[i]) {
prime[++tot] = i;
ans++;
}
for (int j = 1; j <= tot && 1ll * i * prime[j] <= n; j++) {
f[i * prime[j]] = 1;
if (i % prime[j] == 0)break;
}
pre[i]=ans;
}
return;
}
int qpow(int a, int b, int m) {
int result = 1;
a %= m;
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return result;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Euler(100001);
int t;
cin >> t;
while (t--) {
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
int a;
cin>>a;
ans=max(ans,a);
}
cout<<ans<<'\n';
}
return 0;
}
M. Window Decoration
一道思维题,只需要判断两个点的位置否是距离为一,重合的情况减去即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e8+10;
const int MOD = 1e9 + 7;
int qpow(int a, int b, int m) {
int result = 1;
a %= m;
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return result;
}
struct node{
int x;
int y;
}v[10086];
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Euler(100001);
int t;
cin >> t;
int n=t;
int k=0;
while (t--) {
int a,b;
cin>>a>>b;
v[k].x=a;
v[k++].y=b;
}
int cnt=0;
int ans=0;
sort(v,v+k,[](node a,node b){return a.x<b.x||(a.x==b.x&&a.y<b.y);});
for(int i=0;i<k-1;i++) {
if (v[i].x == v[i + 1].x) {
if (abs(v[i].y - v[i + 1].y) == 1) {
cnt++;
} else if (v[i].y == v[i + 1].y) {
ans++;
}
}
}
sort(v, v + k, [](node a, node b) { return a.y < b.y||(a.y==b.y&&a.x<b.x); });
for (int i = 0; i < k - 1; i++) {
if (v[i].y == v[i + 1].y) {
if (abs(v[i].x - v[i + 1].x) == 1) {
cnt++;
}
}
}
cout<<n*2-cnt*0.5-ans*2.00<<'\n';
return 0;
}
G. Disappearing Number
打表专选,我们可以算出每位上的不含x的个数,然后全部加起来,一共有18种,我们只需要打表把18种的个数求出来,然后计算每一位的和即可,好题
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e8+10;
const int MOD = 2e18;
int qpow(int a, int b, int m) {
int result = 1;
a %= m;
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return result;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Euler(100001);
int t;
cin >> t;int v[19]={0,1,
19,
271,
3439,
40951,
468559,
5217031,
56953279,
612579511,
6513215599,
68618940391,
717570463519,
7458134171671,
77123207545039,
794108867905351,
8146979811148159,
83322818300333431,
849905364703000879};
while (t--) {
int n,x;
cin>>n>>x;
int sum=0;
int s=n;
int res=1;
while(n>0){
int cnt=n%10;
n/=10;
if(cnt>=x){
sum+=qpow(10,res-1,MOD)+(cnt-1)*v[res-1];
}else{
sum+=(cnt)*v[res-1];
}
res++;
}
cout<<s+1-sum<<'\n';
}
return 0;
}
L. Chess
挺抽象的找规律,把当前数字转换成从2开始的进制 ,如果最后一位不为零,就是答案,其实就是能不能整除x
#include <bits/stdc++.h>
using namespace std;
#define int long long
string ca(int n,int radix)
{
string ans="";
int t=n%radix;
if(t>=0&&t<=9) ans+=(t+'0');
else ans+=(t-10+'a');
n/=radix;
return ans;
}
int32_t main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for(int i=2;;i++){
if(ca(n,i)!="0"){
cout<<i<<'\n';
break;
}
}
}
return 0;
}
小训练
C. Increasing Sequence with Fixed OR
这道题我wa了两发,一是把0考虑进去了,另一个是bitset的数据范围开太小了,其实我们通过样例就可以观察出
这个数据答案肯定是不超过n的,我们把n考虑进去,转换成二进制,我们只需要让每一个二进制的1变成0,当最大的1变成零的时候也就结束了,因为找不到更小可以异或成n了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main() {
int t;
cin >> t;
while (t--) {
int n;
cin>>n;
if(n==1)cout<<1<<'\n'<<1<<'\n';
else{
set<int>st;
bitset<64>bt;
bt=bitset<64>(n);
for(int i=0;i<bt.size();i++){
bool pd=bt.test(i);
if(pd){
bt.flip(i);
}
if(bt.to_ullong()==0){
bt.flip(i);
continue;
}
if(bt.to_ullong()>n)break;
st.insert(bt.to_ullong());
if(pd){
bt.flip(i);
}
}
cout<<st.size()<<'\n';
for(auto it:st){
cout<<it<<' ';
}
cout<<'\n';
}
}
return 0;
}