2015 北京区域赛 K 二叉树乱搞(数位dp 误)
来源:互联网 发布:华为查看mac表ip 编辑:程序博客网 时间:2024/05/16 14:58
题意:
f(2n) = f(n)*3
f(2n+1) = f(n)*3+1
mod k以后,统计异或和
n 10^18
10^18数据量,一般都要转化成二进制搞
据说还有数位dp的做法,并不会
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <queue>#include <vector>#include <iostream>#define N 520using namespace std;typedef long long ll;ll dp[6][62][70000];ll f2[62];ll nxt[6][70000][2];ll tmp[2][70000];ll ans[70000];void init(){ ll i, j, mod, t; f2[0] = 1; for( i = 1; i <= 60; i ++ )f2[i] = f2[i-1]*2; for( j = 1; j <= 5; j ++ ){ if( j == 1 )mod = 3; if( j == 2 )mod = 5; if( j == 3 )mod = 17; if( j == 4 )mod = 257; if( j == 5 )mod = 65537; for( i = 0; i < mod; i ++ ){ nxt[j][i][0] = 3*i%mod; nxt[j][i][1] = (3*i+1)%mod; } dp[j][1][1] = 1; for( i = 1; i <= 60; i ++ ){ for( t = 0; t < mod; t ++ ){ dp[j][i+1][nxt[j][t][0]] += dp[j][i][t]; dp[j][i+1][nxt[j][t][1]] += dp[j][i][t]; } }// init 61 hang for( i = 1; i <= 60; i ++ ){ for( t = 0; t < mod; t ++ ){ dp[j][i+1][t] += dp[j][i][t]; } } }}int main(){ int i, j, t, p; int T, id; ll n, k, mod; init(); scanf("%d", &T); while( T -- ){ scanf("%lld%lld", &n, &k); if( k == 3 )id = 1; if( k == 5 )id = 2; if( k == 17 )id = 3; if( k == 257 )id = 4; if( k == 65537 )id = 5; for( i = 1; i <= 60; i ++ ){ if( n == f2[i]-1 ){ for( j = 0; j < k; j ++ ){ ans[j] = dp[id][i][j]; } n = 0; break; } else if( n > f2[i]-1 && n < f2[i+1]-1 ){ for( j = 0; j < k; j ++ ){ ans[j] = dp[id][i][j]; } n -= f2[i]-1; break; } } ll res = 0; if( !n ){ for( i = 0; i < k; i ++ ){ //printf("%lld ", ans[i]); res ^= ans[i]; } //puts(""); printf("%lld\n", res); continue; } int fl = 1, cnt = 1, now = 1; memset( tmp, 0, sizeof(tmp) ); tmp[1][1] = 1; while( i > 0 ){ now ^= 1; for( j = 0; j < k; j ++ )tmp[now][j] = 0; for( j = 0; j < k; j ++ ){ tmp[now][nxt[id][j][0]] += tmp[now^1][j]; tmp[now][nxt[id][j][1]] += tmp[now^1][j]; } if( n > f2[i]/2 ){ fl = nxt[id][fl][1]; n -= f2[i]/2; } else{ tmp[now][nxt[id][fl][1]] --; fl = nxt[id][fl][0]; } i --; } res = 0; for( j = 0; j < k; j ++ ){ ans[j] += tmp[now][j]; //printf("%lld ",ans[j] ); res ^= ans[j]; } //puts(""); printf("%lld\n", res); }}
0 0
- 2015 北京区域赛 K 二叉树乱搞(数位dp 误)
- 2015ICPC北京区域赛K. A Math Problem(数位DP)
- Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
- HDU 6156(数位DP+乱搞)
- 17浙江省赛 数位dp or xjb乱搞
- [BZOJ1223][HNOI2002]Kathy函数(数位DP/乱搞)
- [BZOJ4513][SDOI2016]储能表(数位DP/分治乱搞)
- HDU5119 2014北京区域赛H DP
- 蓝桥杯 K好数(数位DP)
- SCUTOJ1013: K-进制数(数位dp)
- 2015acm区域赛北京
- LA 4329 Ping Pong 2008 北京区域赛 H , BIT 二叉索引树(树状数组)的应用
- 2016亚洲区域赛现场赛北京赛区k题
- hdu5122 K.Bro Sorting (2014ACM亚洲区域赛北京赛区重现)
- hdu 3709 Balanced Number 2010成都区域赛 数位dp
- hihocoder 1636(2017北京区域赛J)(区间dp)
- hdu4089 Activation 概率dp 2011北京区域赛
- 2014 北京区域赛 F Fluorescent HDU5117 (数学+状压+dp)
- Spring02
- 设计模式—简单工厂模式
- Spring03
- protobuf 生成对应的文件
- MD5初探及简单应用
- 2015 北京区域赛 K 二叉树乱搞(数位dp 误)
- c语言翻转一个英文句子
- 深入学习java集合:HashSet<E>实现
- nyoj1249 物资调度 (第七届河南省程序设计大赛)
- 项目:文件压缩与解压
- ng-route模块
- 各种bug汇总
- Unity3D_NGUI_性能优化实践_CPU卡顿
- ListView 点击选中行文字颜色、背景变化