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; }