Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
2016-08-12 19:59
726 查看
提交传送门:Hihocoder 1259 :A Math Problem
题意传送门:UVA Live 7271 A Math Problem
题意:f[1]=1,3∗f[n]∗(f[2∗n]+1)=f[2∗n]∗(1+3∗f[n]),f[2∗n]<6∗f[n],
定义g[t]为f[i]%k==t的i的个数,
求g[0]∧g[1]∧g[2]∧...∧g[k−1]
思路:可以推出f[2∗n]=f[n]∗3,f[2∗n+1]=f[n]∗3+1,
而f[n]=sta[x]∗3x+sta[x−1]∗3(x−1)+...+sta[0]∗30,sta[0]表示每一位可以为0或者1
然后利用数位dp就好了
题意传送门:UVA Live 7271 A Math Problem
题意:f[1]=1,3∗f[n]∗(f[2∗n]+1)=f[2∗n]∗(1+3∗f[n]),f[2∗n]<6∗f[n],
定义g[t]为f[i]%k==t的i的个数,
求g[0]∧g[1]∧g[2]∧...∧g[k−1]
思路:可以推出f[2∗n]=f[n]∗3,f[2∗n+1]=f[n]∗3+1,
而f[n]=sta[x]∗3x+sta[x−1]∗3(x−1)+...+sta[0]∗30,sta[0]表示每一位可以为0或者1
然后利用数位dp就好了
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; long long num[66537],dp[65][66537],P[65],n,tmp[65][66537]; int dig[100],sz; bool vis[100]; int k; void dfs(int pos,int remain,int limit){ if(pos<0){ num[remain]++; return ; } if(!limit&&vis[pos]){ int rr=remain*P[pos+1]%k; for(int i=0;i<k;i++) num[ (rr+i)%k ]+=dp[pos][i]; return ; } int now=sz; if(!limit) ++sz,memcpy(tmp[now],num,k*sizeof(long long)); int last=(limit==0 ? 1:dig[pos]); for(int i=0;i<=last;i++) dfs(pos-1,(remain*3+i)%k,limit && (i==last) ); if(!limit){ vis[pos]=true; for(int i=0;i<k;i++) dp[pos][i]=num[i]-tmp[now][i]; } } void solve(long long m){ int ed=0; for(int i=0;i<=63;i++){ if((1LL<<i)&m) ed=i,dig[i]=1; else dig[i]=0; } dfs(ed,0,1); } int main(){ int _; scanf("%d",&_); while(_--){ scanf("%lld%d",&n,&k); memset(vis,false,sizeof(vis)); memset(num,0,sizeof(num)); memset(dp,0,k*sizeof(long long)); memset(tmp,0,k*sizeof(long long)); P[0]=1,sz=0; for(int i=1;i<=64;i++) P[i]=P[i-1]*3%k; solve(n); long long ans=0; num[0]--; for(int i=0;i<k;i++) ans^=num[i]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- hihoCoder 1259 A Math Problem 数位dp
- 2015ICPC北京区域赛K. A Math Problem(数位DP)
- hihoCode 1249 A Math Problem ACM/ICPC 2015 Beijing (数位dp+规律)
- hihocoder 1259 推公式+数位dp(非dfs写法)
- hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
- hdu 5435 A serious math problem(数位dp)
- hihocoder 1259 (数位DP)
- hihocoder 1257 2015北京区域赛I
- HihoCoder 1259 数位DP
- Hdu 5803 Zhu’s Math Problem(非记忆化数位dp)
- hihoCoder 1257 Snake Carpet (构造题+详解) 2015北京区域赛
- hihocoder 2015ACM-ICPC 北京赛区 Problem A. Xiongnu's Land
- hihoCoder1252 2015北京区域赛 D.Kejin Game
- [hihocoder1259] A Math Problem (数学,数位dp)
- uvalive7271(A Math Problem) 数位dp
- hdu 5803 Zhu’s Math Problem (2016多校第六场1011)数位dp
- [HDU5435] A serious math problem(数位dp)
- hihoCoder 1259 A Math Problem(数位dp)
- hdu 5435 A serious math problem 数位dp
- UVALive 7271 A Math Problem 【数位dp计数】