CCF201312-4 有趣的数

思路:

这道题对我来说一开始想通过枚举找规律,然后确实发现了一点规律,但是是后缀的规律,只能说没有理论证明所以导致最后的结果并不正确。

这也说明了现在靠自学成才是不可能的事,需要系统理论的学习。

这里应该使用数位DP,也就是用不同的状态表示前面的数的属性,然后每次插入数据时根据状态进行转移,这里可以看:

https://www.cnblogs.com/meelo/p/7676143.html

 

 代码:

#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
long long int MOD = 1000000007;
using namespace std;
int main(){
    int n;
    long long s2 = 1, s20 = 0, s23 = 0, s230 = 0, s201 = 0, s2301 = 0;
    cin>>n;
    for(int i = 1;i<n;i++){
        s2301 = s2301 * 2 + s230 + s201;
        s2301 %= MOD;
        s230 = s230 * 2 + s23 + s20;
        s230 %= MOD;
        s201 = 2 * s201 + s20;
        s201 %= MOD;
        s20 = 2 * s20 + s2;
        s20 %= MOD;
        s23 = s23 + s2;
        s23 %= MOD;
        s2 = s2;
        s2 %= MOD;
    }    
    cout<<s2301;
    return 0;
}

 

posted @ 2021-11-10 22:41  重言  阅读(36)  评论(0)    收藏  举报