LightOJ
来源:互联网 发布:淘宝的鹰眼系统 编辑:程序博客网 时间:2024/06/11 03:37
Painful Bases
LightOJ - 1021For convenience let's assume that we are dealing with the bases from 2 to 16. The valid symbols are 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E and F. And you can assume that all the numbers given in this problem are valid. For example 67AB is not a valid number of base 11, since the allowed digits for base 11 are 0 to A.
Now in this problem you are given a base, an integer K and a valid number in the base which contains distinct digits. You have to find the number of permutations of the given number which are divisible by K. K is given in decimal.
For this problem, you can assume that numbers with leading zeroes are allowed. So, 096 is a valid integer.
思路:状压DP。用d[i][k]表示在i这个状态,余数为k的排列有多少种。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;long long d[1<<16][21];char s[20];int base,mod;long long getsum(int i,int j){int th=0;while(i)th+=i%2,i/=2;long long sum=1;for(i=0;i<th;i++){sum*=base;sum%=mod;}if(s[j]>='0'&&s[j]<='9')return (sum*(s[j]-'0'))%mod;return (sum*(s[j]-'A'+10))%mod;}int main(){int T,n,cas=1;cin>>T;while(T--){cin>>base>>mod;scanf("%s",s);n=strlen(s);memset(d,0,sizeof d);d[0][0]=1;for(int i=0;i<(1<<n);i++){for(int j=0;j<n;j++){if(i&(1<<j))continue;long long sum=getsum(i,j); //求出j加到当前状态的值for(int k=0;k<mod;k++)d[i|(1<<j)][(k+sum)%mod]+=d[i][k];}}printf("Case %d: %lld\n",cas++,d[(1<<n)-1][0]);}return 0;}
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- [LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- 【YOLO】记录训练输出并对结果评估
- 中国移动业务支撑系统简介(BOSS、BASS、BOMC、4A及VGOP)
- [RK3288][Android6.0] 调试笔记 --- Netd测试工具ndc
- fragment 的生命周期的补充说明--特别要注意的四点
- 同时打开多个模拟器
- LightOJ
- QT设置字体与颜色
- php接口文件(token)
- Fragment启动生命周期
- 理解协程的运行流程
- Objective -C
- 字符串的替换空格问题
- 实例3-2 List Leaves
- 用户填表有大量数据的数据提交解决方式