• CF 191 div2


    A.数据量很小,直接爆搞。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <vector>
    #include <stack>
    #include <map>
    #include <iomanip>
    #define PI acos(-1.0)
    #define Max 2505
    #define inf 1<<28
    #define LL(x) ( x << 1 )
    #define RR(x) ( x << 1 | 1 )
    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mp(a,b) make_pair(a,b)
    #define PII pair<int,int>
    using namespace std;
    
    int a[111] ;
    int num[11111] ;
    int main() {
    
        int n ;
        cin >> n ;
        int ans = 0 ;
        for (int i = 1 ; i <= n ;i ++ ){
            cin >> a[i] ;
            num[i] = num[i - 1] + a[i] ;
        }
        ans = num[n] - 1 ;
         for(int i = 1; i <= n; ++i ){
            for(int j = 1; j <= i; ++ j){
                int sum = num[n] - 2 * ( num[i] - num[j-1] ) + ( i - j + 1  );
                ans = max(sum ,ans) ;
            }
         }
        cout << ans << endl;
    
    
        return 0 ;
    }
    

    B,直接打个素数表,然后输出前N个素数就可以了。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <vector>
    #include <stack>
    #include <map>
    #include <iomanip>
    #define PI acos(-1.0)
    #define Max 2505
    #define inf 1<<28
    #define LL(x) ( x << 1 )
    #define RR(x) ( x << 1 | 1 )
    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mp(a,b) make_pair(a,b)
    #define PII pair<int,int>
    using namespace std;
    
    bool flag[11111111] ;
    void prime(){
        flag[0] = 1 ;
        flag[1] = 1 ;
        flag[2] = 0 ;
        for (int i = 2 ;i <= 1300000 ; i ++ ){
            if(!flag[i]){
                for (int j = 2 * i ;j <= 1300000 ;j += i){
                    flag[j] = 1 ;
                }
            }
        }
    }
    int a[111] ;
    int num[1111111] ;
    int main() {
        prime() ;
        int nn = 0 ;
        for (int i = 2 ;i <= 1300000 ;i ++ ){
            if(!flag[i])num[nn ++ ] = i ;
        }
        int n ;
        cin >> n ;
        cout << num[0] ;
        for (int i = 1 ;i < n ;i ++ ){
            printf(" %d",num[i]) ;
        }
        cout << endl;
        return 0 ;
    }
    

    C,可以推出,k个连续的字符串是满足等比数列的关系的。

    所以我们只需求出a1 和比例q就可以了。

    首相就是只有一个字符串的时候,所有的删除的总和。

    q就是pow(2 , l),l是字符串的长度。

    等比数列求和公式 (a1 * (q ^ n - 1)) / (q - 1)%MOD 。先将a1 拿到外面去,不参与计算。我们设q ^ n - 1为a ,q - 1 为b 。那么式子就变成a / b %MOD 。这就变成很熟悉的拓展欧几里德了,先求出b % MOD的逆元x . x * b % MOD  = 1 ,那么 (a / b ) %MOD * (x * b) % MOD 的值不变,那么可以将式子化简成(a * x) % MOD 。

    最后再将a1乘上即可。

    #define MOD 1000000007
    
    char a[111111] ;
    
    inline ll extend_gcd(ll a ,ll b , ll& x , ll& y){
        ll ans , t ;
        if(b == 0){
            x = 1 ;
            y = 0 ;
            return a ;
        }
        ans = extend_gcd(b , a % b ,x ,y ) ;
        t = x ;
        x = y ;
        y = t - (a / b) * y ;
        return ans ;
    }
    
    
    ll quick_pow(ll a ,ll b , ll M){
        ll ret = 1 ;
        ll temp = a ;
        while(b){
            if(b & 1){
                ret = (ret * temp) % M ;
            }
            temp = (temp * temp) % M  ;
            b >>= 1 ;
        }
        return ret ;
    }
    int main(){
        cin >> a ;
        int k ;
        cin >> k ;
        int l = strlen(a) ;
        ll a1 = 0 ;
        REP(i , 0 ,l - 1 ){
             if(a[i] == '0' || a[i] == '5'){
                a1 = (a1 + quick_pow(2 ,i ,MOD)) % MOD ;
            }
        }
        ll a = quick_pow(2 , l ,MOD) ;
        ll aa = (a - 1 + MOD) % MOD ;
        ll x , y ;
        extend_gcd(aa ,MOD , x ,y) ;
        x = (x + MOD) % MOD ;
        ll c = (quick_pow(a , k  ,MOD) - 1) * x % MOD ;
        ll ans = c * a1 % MOD ;
        cout << ans << endl;
        return 0 ;
    }


    D,DFS,每次进入一个空地,先将他建成蓝色的,然后向四个方向DFS,最后回溯的时候将这个蓝色的建筑拆掉建成红色的,当然第一个进入的点是不能建成红色的。

    这个很容易证明,一个联通块里面,肯定有一个是蓝色的,其他都是红色的。


    int n , m ;
    char op[11111111] ;
    int xx[11111111] ;
    int yy[11111111] ;
    int ss[555][555] ;
    char Map[555][555] ;
    int num = 0 ;
    void dfs(int x ,int y ,int first ) {
        if(x < 1 || x > n || y < 1 || y > m)return ;
        op[num] = 'B' ;
        xx[num] =  x ;
        yy[num] = y ;
        num ++ ;
        ss[x][y] = 0 ;
        if(ss[x - 1][y])dfs(x - 1 ,y , 1) ;
        if(ss[x][y - 1])dfs(x ,y - 1 ,1 ) ;
        if(ss[x + 1][y])dfs(x + 1 ,y , 1) ;
        if(ss[x][y + 1])dfs(x ,y + 1 ,1 ) ;
        if(first) {
            op[num] = 'D' ;
            xx[num] = x ;
            yy[num] = y ;
            num ++ ;
            op[num] = 'R' ;
            xx[num] = x ;
            yy[num] = y ;
            num ++ ;
        }
    }
    int main() {
        cin >> n >> m ;
        for (int i = 1 ; i <= n ; i ++ ) {
            for (int j = 1 ; j <= m ; j ++ ) {
                cin >> Map[i][j] ;
                if(Map[i][j] == '.') {
                    ss[i][j] = 1 ;
                }
            }
        }
        for (int i = 1 ; i <= n ; i ++ ) {
            for (int j = 1 ; j <= m ; j ++ ) {
                if(ss[i][j]) {
                    dfs(i ,j , 0 ) ;
                }
            }
        }
        cout << num << endl;
        for (int i = 0 ; i < num ; i ++ ) {
            cout << op[i] << " " << xx[i] << " " << yy[i] << endl;
        }
        return 0 ;
    }

    E。状态压缩DP。

    枚举1<< 24的状态。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <vector>
    #include <stack>
    #include <map>
    #include <iomanip>
    #define PI acos(-1.0)
    #define Max 2505
    #define inf 1<<28
    #define LL(x) ( x << 1 )
    #define RR(x) ( x << 1 | 1 )
    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mp(a,b) make_pair(a,b)
    #define PII pair<int,int>
    using namespace std;
    
    #define MOD 1000000007
    
    inline void RD(int &ret) {
        char c;
        do {
            c = getchar();
        } while(c < '0' || c > '9') ;
        ret = c - '0';
        while((c=getchar()) >= '0' && c <= '9')
            ret = ret * 10 + ( c - '0' );
    }
    
    int a[111111] ;
    int sum[1 << 24] ;
    int dp[1 << 24] ;
    int k[11] ;
    
    int main(){
    
        int n ;
        cin >> n  ;
        for (int i = 0 ;i < n ; i ++ ){
            RD(a[i]) ;
        }
    
        int m ;
        cin >> m ;
        for (int i = 0 ;i < m ;i ++ ){
            RD(k[i]) ;
        }
        dp[0] = 1 ;
        for (int i = 1 ;i < (1 << n) ; ++ i){//枚举当前路径
            int pos ;
            bool flag = 0 ;
            sum[i] = 0 ;
            for (int j = 0 ;j < n ;j ++ ){
                if(i & (1 << j)){//i 在 j 这点为1 ,直接在这里找出sum[i]的值会T。O(2 ^ 24 *  n)
                    pos = j ;//一开始我直接写sum[i] += a[j] ;就T了
                    break ;
                }
            }
            sum[i] = sum[i ^ (1 << pos)] + a[pos] ;//i 状态的所有步数。
            for (int j = 0 ; j < m ;j ++ ){//i状态的步数是否不能走。
                if(sum[i] == k[j]){
                    dp[i] = 0 ;
                    flag = 1 ;
                    break ;
                }
            }
            if(flag)continue ;
            dp[i] = 0 ;
            for (int j = 0 ;j < n ;j ++ ){
                if(i & (1 << j)){//i 这位可以由i ^ (1 << j )这一状态过来。
                    dp[i] = (dp[i] + dp[i ^ (1 << j)]) ;
                    if(dp[i] >= MOD)dp[i] -= MOD ;
                }
            }
        }
    
        cout << dp[(1 << n) - 1] << endl;
        return 0 ;
    }
    





  • 相关阅读:
    jsp <img src="“> src 相对路径的问题
    记一次Intellij-IDEA配置JDK1.8,支持Lambda新特性
    centOS6.5 查看 启动 关闭防火墙
    java设计模式之--工厂方法模式
    BlockingQueue之---ArrayBlockingQueue
    两个线程,一个为123456,一个为ABCDEF、交替打印出1A2B3C...
    JUC之---超好用的阻塞锁
    JUC之---读写锁
    java设计模式之--代理模式
    java设计模式之--线程安全的单例模式
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3202918.html
Copyright © 2020-2023  润新知