hdu5435 數位dp(大數的處理)
http://acm.hdu.edu.cn/showproblem.php?pid=5435
Problem Description
Xiao Jun likes math and he has a serious math question for you to finish.
Define F[x] to the xor sum of all digits of x under the decimal system,for example F(1234) = 1 xor 2 xor 3 xor 4 = 4.
Two numbers a,b(a≤b) are given,figure out the answer of F[a] + F[a+1] + F[a+2]+…+ F[b−2] + F[b−1] + F[b] doing a modulo 109+7.
Define F[x] to the xor sum of all digits of x under the decimal system,for example F(1234) = 1 xor 2 xor 3 xor 4 = 4.
Two numbers a,b(a≤b) are given,figure out the answer of F[a] + F[a+1] + F[a+2]+…+ F[b−2] + F[b−1] + F[b] doing a modulo 109+7.
Input
The first line of the input is a single integer T(T<26),
indicating the number of testcases.
Then T testcases follow.In each testcase print three lines :
The first line contains one integers a.
The second line contains one integers b.
1≤|a|,|b|≤100001,|a| means the length of a.
Then T testcases follow.In each testcase print three lines :
The first line contains one integers a.
The second line contains one integers b.
1≤|a|,|b|≤100001,|a| means the length of a.
Output
For each test case, output one line "Case #x: y", where x is
the case number (starting from 1) and y is
the answer.
Sample Input
4
0
1
2
2
1
10
9999
99999
Sample Output
Case #1: 1
Case #2: 2
Case #3: 46
Case #4: 649032
/**
hdu5435 數位dp(大數的處理)
題目大意:一個數字的值為它各個位上數字異或的結果,給定兩個數,問二者閉區間內有所有數字值得和為多少?
解題思路:我用的是記憶話搜尋的寫法,好像遞迴耗時比較多吧,比賽時過了,後來給判掉了,最後老是TLE。
網上學的方法: dp[i][j][k]表示前i位數(k==0||k==1)異或值為j的數有多少個,k為0則表示到結尾了,1表示沒有到結尾
最後注意分別取模會TLE,具體看程式碼怎麼實現的吧
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn=100005;
const LL mod=1e9+7;
char s1[maxn],s2[maxn];
int bit[maxn];
LL dp[maxn][16][2];
LL solve(char *a)
{
int n=strlen(a);
for(int i=1; i<=n; i++)bit[i]=a[i-1]-'0';
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int i=0; i<n; i++)
{
int num=bit[i+1];
for(int j=0; j<16; j++)
{
dp[i][j][0]%=mod;
dp[i][j][1]%=mod;
if(dp[i][j][0]>0)
{
dp[i+1][j^num][0]+=dp[i][j][0];
for(int k=0; k<num; k++)
{
dp[i+1][j^k][1]+=dp[i][j][0];
}
}
if(dp[i][j][1]>0)
{
for(int k=0; k<=9; k++)
{
dp[i+1][j^k][1]+=dp[i][j][1];
}
}
}
}
LL ans=0;
for(int i=1; i<=15; i++)
{
ans+=(dp[n][i][0]+dp[n][i][1])*(LL)i;
ans%=mod;
}
ans%=mod;
return ans;
}
int main()
{
int T,tt=0;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s1,s2);
int n=strlen(s1);
LL ans=s1[0]-'0';
for(int i=1; i<n; i++)
ans^=(s1[i]-'0');
printf("Case #%d: %I64d\n",++tt,(solve(s2)-solve(s1)+ans+mod)%mod);
}
return 0;
}
相關文章
- [DP] 數位DP
- 數位 dp
- 【數位dp】(涉及到處理前導0問題)
- 【數位dp】學習
- 數位DP小記
- 大數加法(處理不了負數)
- 處理器運算位數
- 1082. 數字遊戲 (數位DP)遊戲
- 學習筆記:數位dp筆記
- 數位DP 學習筆記筆記
- 【學習筆記】數位DP筆記
- MySQL 數值型別溢位處理MySql型別
- 處理器指令集架構的位數架構
- CodeForces - 628D (數位dp)
- 演算法隨筆——數位DP演算法
- CodeForces 401D 數位DP
- 【數位dp入門】51nod 1009 數字1的數量
- perl格式串處理整數溢位漏洞(轉)
- Python對數字的千分位處理方式Python
- 大數量的DML時對索引處理的技巧索引
- 【數位dp】Beautiful numbers CodeForces - 55D
- php 處理 浮點數 精度運算 數字處理等PHP
- java中大數處理和高精度小數處理(so easy)Java
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- MyBatis 引數處理MyBatis
- 數學處理類
- CSS 小數 處理CSS
- BZOJ 3329 Xorequ:數位dp + 矩陣快速冪矩陣
- JavaScript 中的引數處理JavaScript
- 計數類 DP
- [筆記]數位dp例題及詳解(更新中)筆記
- 數字影象處理DIP
- 1470 數列處理
- 前處理器變數變數
- 塗顏色(數論,大資料輸入處理)大資料
- BZOJ3329: Xorequ(二進位制數位dp 矩陣快速冪)矩陣
- 大資料爭論:批處理與流處理的C位之戰大資料
- 合法方案數(dp)