zoukankan      html  css  js  c++  java
  • URAL1586——DP——Threeprime Numbers

    Description

    Rest at the sea is wonderful! However, programmer Pasha became awfully bored of lying on a beach in Turkey; so bored that he decided to count the quantity of three-digit prime numbers. This turned out to be so interesting that he then started to study threeprime numbers. Pasha calls an integer a threeprime number if any three consecutive digits of this integer form a three-digit prime number. Pasha had already started working on the theory of the divine origin of such numbers when some vandals poured water on Pasha and cried some incomprehensible words like “Sonnenstich!”, “Colpo di sole!”, and “Coup de soleil!”
    You are to continue Pasha’s work and find out how often (or rare) threeprime numbers are.

    Input

    The input contains an integer n (3 ≤ n ≤ 10000).

    Output

    Output the quantity of n-digit threeprime numbers calculated modulo 10 9 + 9.

    Sample Input

    inputoutput
    4
    
    204
    

    大意:给你一个n表示几位数,让你输出满足三素数的数有多少个,三素数的定义为每三个连续的数都是一个素数

    自己想到了大致要定义一个prime[j][k][l]来判断,还是想不出状态转移方程

    状态转移方程  下一个状态可以由dp[i-1][k][l] 得到,所要添加的只是最高位,只要满足最高位以及接下来的两个数的集合也满足的话就行

    也就是   dp[i][j][k] = dp[i][j][k] + dp[i-1][k][l],前一个状态的dp值是i-1位的时候所有满足条件的情况所以只要判prime[j][k][l]是素数就行

    PS:

    今天只A了一道0.0 看了原来的题目对于dp的for上下两个循环有了一点新的感觉

    假如那道免费馅饼  dp[i][j] = max(max(dp[i-1][j],dp[i-1][j+1]),dp[i-1][j+1]);

    那么要得到dp[i][j] 所得的都是dp[i-1]这个时间推来的,所以必须先把这种状态算出来

    for(int i = 1; i <= t1; i++)

     for(int j = 0 ; j <= 10;j++)

    把i-1这个状态的值都得出来

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    long long  dp[10100][10][10];
    int prime[10][10][10];
    const int mod = 1e9 + 9;
    void solve()
    {
        int j;
        memset(prime,0,sizeof(prime));
        for(int i = 100; i <= 999;i++){
            for( j = 2; j < i;j++){
                if(i%j == 0)
                break;
            }
            if(j >= i){
                int x1 = i/100;
                int x2 = (i%100)/10;
                int x3 = i%10;
                prime[x1][x2][x3] = 1;
            }
        }
          
        for(int i = 1; i <= 9; i++){
            for(int j = 0 ; j <= 9;j++){
                for(int k = 0 ; k <= 9; k++){
                    if(prime[i][j][k])
                    dp[3][i][j]++;
                }
            }
        }
        for(int i = 4; i <= 10000;i++){
            for(int j = 1; j <= 9; j++){
                for(int k = 0 ; k <= 9; k++){
                    for(int l = 0 ; l <= 9;l++){
                        if(prime[j][k][l])
                        dp[i][j][k] = (dp[i-1][k][l] + dp[i][j][k]) % mod;
    
                    }
                }
            }
        }
    }
    int main()
    {
        solve();
        int n;
        while(~scanf("%d",&n)){
            long long  res = 0;
            for(int i = 1; i <= 9;i++){
                for(int j = 0 ; j <= 9;j++){
                res += 1ll*dp[n][i][j];
                res%=mod;
                }
            }
            printf("%lld
    ",res);
        }
        return 0;
    }
    

      

  • 相关阅读:
    毕业设计进度:3月8日
    毕业设计进度:3月7日
    毕业设计进度:3月6日
    毕业设计进度:3月5日
    深拷贝、浅拷贝
    itertools模块中的product方法
    confusion_matrix函数的使用
    sklearn中的交叉验证(Cross-Validation)
    python pandas(ix & iloc &loc)
    Python: sklearn库——数据预处理
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4490883.html
Copyright © 2011-2022 走看看