zoukankan      html  css  js  c++  java
  • codeforces #447 894A QAQ 894B Ralph And His Magic Field 894C Marco and GCD Sequence

    A.QAQ

    • 题目大意:从给定的字符串中找出QAQ的个数,三个字母的位置可以不连续
    • 思路:暴力求解,先找到A的位置,往前扫,往后扫寻找Q的个数q1,q2,然
    • 后相乘得到q1*q2,这就是这个A能够找到的QAQ个数,依次累加即可
    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        string s;
        cin>>s;
        int len=s.length(),sum=0;
        for(int i=0;i<len;++i) {
            if(s[i]=='A') {
                int num1,num2;
                num1=num2=0;
                for(int j=0;j<i;++j) if(s[j]=='Q') num1++;
                for(int j=i+1;j<len;++j) if(s[j]=='Q') num2++;
                if(num1&&num2) sum+=num1*num2;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
    

    B. Ralph And His Magic Field

    • 题目大意:给一个(n*m)的格子,使得每一行与每一列都等于给定的k值,k取1或者-1
    • 我比较笨,没做出来,下来之后补题用达标发现规律
    • 最后的方案数为(res = 2 ^{(n-1)*(m-1)})(n,m)一个是奇数一个是偶数,且(k==-1)时直接输出0即可
    • 注意先计算(2^{(n-1)})再计算((2^{(n-1)})^{m-1}),不然直接计算会使得中途的结果就不一样
    • 最终程序:
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    typedef long long ll;
    const ll mod = 1000000007;
    ll n,m,k;
    ll qpow(ll base, ll num) {
        ll res=1;
        while(num) {
            if(num&1) res=((res%mod)*(base%mod))%mod;
            num>>=1;
            base=((base%mod)*(base%mod))%mod;
        }
        return res;
    }
    int main() {
        scanf("%I64d %I64d %I64d",&n,&m,&k);
        if(((n&1)!=(m&1))&&k==-1) {
            printf("0
    ");
            return 0;
        }
        printf("%I64d
    ", qpow(qpow(2,n-1),m-1));
        return 0;
    }
    
    • 打表程序
    #include <iostream>
    using namespace std;
    int a[14][14];
    int b[2]={-1,1};
    int n,m,num,sum=0;
    bool check() {
        int temp;
        for(int i=1; i<=n; ++i) {
            temp=1;
            for(int j=1; j<=m; ++j) {
                temp*=a[i][j];
            }
            if(temp!=num) return false;
        }
        for(int i=1; i<=m; ++i) {
            temp=1;
            for(int j=1; j<=n; ++j) {
                temp*=a[j][i];
            }
            if(temp!=num) return false;
        }
        return true;
    }
    void dfs(int x, int y) {
        for(int i=0; i<=1; ++i) {
            a[x][y]=b[i];
            if(x<n&&y<m) dfs(x,y+1);
            else if(x<n&&y==m) dfs(x+1,1);
            else if(x==n&&y<m) dfs(x,y+1);
            else if(x==n&&y==m) {
                if(check()) sum++;
            }
        }
    }
    int main() {
        while(cin>>n>>m>>num) {
            sum=0;
            dfs(1,1);
            cout<<sum<<endl;
        }
        return 0;
    }
    

    C. Marco and GCD Sequence

    • 题目大意:给定已经求出的区间gcd,看是否存在序列满足求出的gcd
    • 思路:因为给定了gcd,那么可使最小的数要成为其他区间的gcd(插
    • 入),这是一定满足要求的解法。如果其他数不能被最小数整除,这
    • 说明给定gcd缺少了元素。
    • eg_1: 2 3 6 10
    • 其中3不能被2整除,说明给定gcd缺少了元素,添加1:1 2 3 6 10才可以
    • answer:1 (1) 2 (1) 3 (1) 6 (1) 10 gcd(ai,aj)=1;
    • eg_2:1 3 5 6 10 15 把最小数插入中间即可满足
    • answer:1 (1) 3 (1) 5 (1) 6 (1) 10 (1) 15 gcd(ai,aj)=1;
    #include <iostream>
    using namespace std;
    int main() {
        int n,ans[1005];
        cin>>n;
        for(int i=1;i<=n;++i) cin>>ans[i];
        for(int i=1;i<=n;++i) {
            if(ans[i]%ans[1]) {
                cout<<"-1"<<endl;
                return 0;
            }
        }
        cout<<n+(n-1)<<endl;
        for(int i=1;i<n;++i) cout<<ans[i]<<" "<<ans[1]<<" ";
        cout<<ans[n]<<endl;
        return 0;
    }
    
  • 相关阅读:
    二叉苹果树|codevs5565|luoguP2015|树形DP|Elena
    没有上司的舞会|codevs1380|luoguP1352|树形DP|Elena
    NYOJ15|括号匹配(二)|区间DP|Elena
    AtCoder Beginner Contest 070|Elena|8.12|#471
    NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索
    7.26-STOIRegularMatch-08-#14
    跳石头|河中跳房子|NOIP2015提高组T4|二分法
    BZOJ2330: [SCOI2011]糖果
    BZOJ1295: [SCOI2009]最长距离
    BZOJ1263: [SCOI2006]整数划分
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7863276.html
Copyright © 2011-2022 走看看