(題目描述中不嚴(yán)謹(jǐn),其實(shí) f() 都是正整數(shù)) 
倍增思想的代碼
#include <cstdio>long long n,m,ans[10000000],b[10000000],a[10000000];//a:上一步的答案(a[i]即(ans[1..x/2]%m==i)的個數(shù))//b:當(dāng)前答案(b[i]即(ans[x/2+1..x]%m==i)的個數(shù))long long f(long long x){return x==1 ? 1:(f(x/2)*3+x%2)%m;}void hehe(long long x){ if (x==1) {ans[1]=a[1]=1; return;} hehe(x/2); for (long long i=0; i<m; i++) b[i]=0; for (long long i=0; i<m; i++) b[(i*3)%m]+=a[i]; for (long long i=0; i<m; i++) b[(i*3+1)%m]+=a[i]; if (x%2==0) b[f(x+1)]--; //處理一下突出的部分 if (x%4<=1) b[f(x/2+1)]++; //同上 for (long long i=0; i<m; i++) {a[i]=b[i]; ans[i]+=a[i];}}int main(){ scanf("%lld%lld",&n,&m); hehe(n); for (long long i=0; i<m; i++)
|
新聞熱點(diǎn)
疑難解答