链接:登录—专业IT笔试面试备考平台_牛客网
给定一个正整数 n,你可以对 n 进行任意次(包括零次)如下操作:
在对 nnn 进行操作后,请问有多少种不同的 n,使得n 不是 3 的倍数?
由于结果可能非常大,请输出对 1000000007 取模的结果。
思路:
线性dp去求解
从前往后去枚举看有多少个时符合条件的
数组dp[i][j]记录当枚举刀第i个其中所以mod3结果是j的数j=0,1,2
然后去转移
比如1223
取123时 你的2可以从第三位和第二位的2继承过来的
dp的转移就是在前面已有的数字末尾加上一个数,如果这个数字是前面没有出过的话就在该位上加上1
第一位 1(0*2+1=1)
第二位 1,12,2(1*2+1=3)
第三位 1,12,2,12,122,22(3*2+0=6)
如果前面出现过的话你发现会和之前的产生重复就是第3位12出现了两次
我们发现第三位的12其实一次从第一位的1加上2继承下去,一次从第二位的1加上一个2继承下去
本质上就是从前一位多继承了一次,因此减去前一位的数就行了,也就是去重一下
第一位 1(0*2+1=1)
第二位 1,12,2(1*2+1=3)
第三位 1,12,2,122,22(3*2+0-1=5)
第四位1,12,2,122,22,13,123,23,1223,223,3(5*2+1=11)
最后在开3位记录是否被3整除是多少就行了
#include
#include
#include//accumulate(be,en,0)
#include//rfind("string"),s.find(string,begin)!=s.npos,find_first _of(),find_last_of()
#include//to_string(value),s.substr(int begin, int length);
#include
#include
#include//res.erase(unique(res.begin(), res.end()), res.end()),reverse(q.begin(),q.end());
#include//priority_queue(big) /priority_queue, greater> q(small)
#include
//#include