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;
}
posted @ 2024-08-13 00:35  冬天的睡袋  阅读(12)  评论(0编辑  收藏  举报