(题目描述中不严谨,其实 f() 都是正整数)
倍增思想的代码
#include <cstdio>long long n,m,ans[10000000],b[10000000],a[10000000];//a:上一步的答案(a[i]即(ans[1..x/2]%m==i)的个数)//b:当前答案(b[i]即(ans[x/2+1..x]%m==i)的个数)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++) PRintf("%lld/n",ans[i]);}新闻热点
疑难解答