HDU 3709 - Balanced Number


http://acm.hdu.edu.cn/showproblem.php?pid=3709
A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the number, the distance from a digit to the pivot is the offset between it and the pivot. Then the torques of left part and right part can be calculated. It is balanced if they are the same. A balanced number must be balanced with the pivot at some of its digits. For example, 4139 is a balanced number with pivot fixed at 3. The torqueses are 4*2 + 1*1 = 9 and 9*1 = 9, for left part and right part, respectively. It's your job
to calculate the number of balanced numbers in a given range [x, y].

Input
The input contains multiple test cases. The first line is the total number of cases T (0 < T ≤ 30). For each case, there are two integers separated by a space in a line, x and y. (0 ≤ x ≤ y ≤ 1018).

Output
For each case, print the number of balanced numbers in the range [x, y] in a line.

Sample Input
2 0 9 7604 24324

Sample Output
10 897

Author
GAO, Yuan

题意:问区间[x,y]内,有多少个平衡数。
一个数是平衡数,即存在一个支点pvt,使得 sum(bit[i]*(pvt-i) )=0;
(x,y属于long long)
要枚举中轴,然后数位dp
https://blog.csdn.net/idealism_xxm/article/details/51412771
又是一个状态很难想的数位DP
对于一个非0数x,最多只存在一个支点pivot使力矩为0
所以支点不同时的统计个数不重复(不包括0),可以直接相加
所以可以设dp[i][j][k]表示长度为i时,支点为j,且高位的数的力矩为k时,满足题意的数的个数
http://www.acmsearch.com/article/show/13958
首先要分析出,对于某个非 0 的 number,最多可能有一个 pivot 的位置。
证明:如果有两个这样的位置,将左边位置移动到右边时,左边的 sigma 一定增大,右边的 sigma 最多保证不减,不可能增大,故不可能再次相等。
于是可以枚举这样的位置,然后分类统计求和。
由于 0 对于每个位置都会被统计到,最后要再减去重复的。


Ps:在 数位dp 的 dfs 中,对于 0 的看待,是 len 个0 放一起,以后这个细节要注意。
LL dp[20][20][1800];

int digit[20];

LL dfs(int len,int fixloc,int sum,bool fp) // fp== isLimited
{
    if(!len)
        return sum == 0 ? 1 : 0;
    if(sum < 0)
        return 0;
    if(!fp && dp[len][fixloc][sum] != -1)
        return dp[len][fixloc][sum];
    int fpmax = fp ? digit[len] : 9;
    LL ret = 0;
    for(int i=0;i<=fpmax;i++){
        ret += dfs(len-1,fixloc,sum+i*(len-fixloc),fp && i == fpmax);
    }
    if(!fp)
        dp[len][fixloc][sum] = ret;
    return ret;
}

LL f(LL n)
{
    if(n == -1)
        return 0;
    int len = 0;
    while(n){
        digit[++len] = n % 10;
        n /= 10;
    }
    LL ret = 0;
    for(int i=len;i>=1;i--){
        ret += dfs(len,i,0,true);
    }
    return ret - len + 1;
}

https://www.itread01.com/content/1541519229.html
分析:很好這又是常見的數位dp , 不過不同的是我們這次需要列舉是哪個位置是平衡點 , 一開始我是想說搜尋到最後以為 ,然後得到這個數的位數 ,在判斷平衡位置 , 想到這樣的話 , 這就說明了我對數位dp 還是不太熟悉的 ,因為這樣的話dfs() 裡面的sum , emmm是找不到狀態的 ;
正解: 依然是列舉平衡點的位置  ,這個思路沒有問題 , 但是這個卻是在so(_) 函式裡面列舉 ,啊這樣就妙不可言了, 這樣的話只要我們在dfs()裡面增加變數 k ,表示是平衡點的位置 , 那這樣的話我的sum 就是記錄 從左到右的貢獻 , 因為是從左到右的列舉 , 左邊加, 右邊減 , 所以是不是sum<0 , 就肯定是不行的嘛 ;哦!還有一個重點 ,因為0也是平衡數來的 , 所以我們這樣的列舉平衡點就加了ans-1 次0 的貢獻 ,這裡巨坑一開始沒有想到,其他程式碼打出來了 , 答案不對 ,然後找程式的錯誤 ,其實這裡是關鍵來的
typedef long long ll;
int dig[20];
ll dp[20][20][1500];

ll dfs(int pos,int piv,int sum,bool limit)
{
    if(sum<0) return 0; //右侧力矩已经大于左侧力矩,已经不可能平衡,不需要再往低位DFS,直接剪枝
    if(pos==0) return sum==0; //已经精确到某一个数,观察一下两侧力矩是否相等.
    if(!limit && dp[pos][piv][sum]!=-1) return dp[pos][piv][sum]; //如果曾计算过dfs(pos,piv,sum,0),直接返回dp[pos][piv][sum]

    int up=limit?dig[pos]:9; //确定当前第pos位的枚举上界
    ll ans=0; //定义ans变量,记录累加结果,在函数最后return ans
    for(int i=0;i<=up;i++) //暴力枚举当前第pos位的数
        ans+=dfs(pos-1,piv,sum+i*(pos-piv),limit && i==up);

    if(!limit) dp[pos][piv][sum]=ans; //将dfs(pos,piv,sum,0)记录到dp[pos][piv][sum]
    return ans;
}
ll solve(ll x)
{
    int len=0;
    while(x) //将上界N记录到dig数组中
    {
        dig[++len]=x%10;
        x/=10;
    }
    ll ans=0;
    for(int i=1;i<=len;i++) ans+=dfs(len,i,0,1);
    return ans-len+1;
}

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts