题目链接:http://codeforces.com/gym/101982/attachments
题意:
n和k,问0到中的n的倍数在二进制下的1的个数和。 k<=128,n<=1000
做法:
看到这个数据量,其实还挺敏感的吧,100*128数据量开数组是没问题了,其实能感觉的出来,不是搜索就是dp,然后就出现了记忆化搜索,数位dp的想法也就出来了,打比赛的时候实在是....想不到...
其实还挺好想的,就不解释了,一眼就看出来了的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000009;
ll dp[130][1010][130];
int n,k;
ll dfs(int pos,int res,int num){
if(pos==0){
return res==0?num:0;
}
if(dp[pos][res][num]!=-1) return dp[pos][res][num];
ll sum=0;
for(int i=0;i<=1;i++){
sum=(sum+dfs(pos-1,(res*2+i)%k,num+i))%mod;
}
dp[pos][res][num]=sum;
return sum;
}
int main(){
memset(dp,-1,sizeof(dp));
scanf("%d%d",&k,&n);
ll ans=dfs(n,0,0);
printf("%lld\n",ans);
return 0;
}