poj2346--Lucky tickets+DP

题意:给定一个n,求n位数中有多少个数的前n/2位的和与后n/2位的和相等.

思路:题目保证n为偶数,我们定义dp[n/2][j]表示前n/2位数和为j的种类数,则答案为sum(dp[n/2][0–n/2*9]).接下来我们进行dp,定义dp[i][j]表示i位数和为j时的种类数,那么其实这个dp就是在10位数中选择i位,构成不同的和,易得转移方程dp[i][j]=sum(dp[i-1][j-k]).

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[10][100];

int main()
{
       int n;
       memset(dp,0,sizeof(dp));
       dp[0][0]=1;
       for(int i=1;i<=5;i++)
          for(int j=0;j<=50;j++)
          {
                for(int k=0;k<=9;k++)
                    if(j>=k)
                          dp[i][j]+=dp[i-1][j-k];
          }
       while(scanf("%d",&n)!=EOF)
       {
             n/=2;
             long long ans=0;
             for(int i=0;i<=n*9;i++)
                 ans+=dp[n][i]*dp[n][i];
             printf("%lld\n",ans);
       }
  return 0;
}
时间: 2024-10-09 20:02:52

poj2346--Lucky tickets+DP的相关文章

DP+高精度 URAL 1036 Lucky Tickets

题目传送门 1 /* 2 题意:转换就是求n位数字,总和为s/2的方案数 3 DP+高精度:状态转移方程:dp[cur^1][k+j] = dp[cur^1][k+j] + dp[cur][k]; 4 高精度直接拿JayYe的:) 5 异或运算的规则: 6 0⊕0=0,0⊕1=1 7 1⊕0=1,1⊕1=0 8 口诀:相同取0,相异取1 9 */ 10 #include <cstdio> 11 #include <cstring> 12 #include <string>

Ural 1036 Lucky Tickets

Lucky Tickets Time Limit: 2000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ID: 103664-bit integer IO format: %lld      Java class name: (Any) You are given a number 1 ≤ N ≤ 50. Every ticket has its 2N-digit number. We call a

寒假集训.Lucky Tickets. Easy!

Lucky Tickets. Easy! Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Background The public transport administration of Ekaterinburg is anxious about the fact that passengers don't like to pay for

【数位DP】Codeforces Gym 100418J Lucky tickets

题意: 设性质P:一个数能够整除它二进制表示下的1的个数.求[1,N]中满足性质P的数的个数.N<=1019. 思路: 数位DP.首先这个数最多有64位,我们可以枚举1的个数x,然后求可以整除x的数的个数.设dp[i][j][k][w]表示从最高位枚举到i位,现在已经构成的数模x余多少(这里是关键,只用考虑余数),现在已经用了k个1,w=0表示现在枚举的这个数已经小于N了,w=1表示从最高位到第i位都与N相同(数位dp计算时的方法:如果当前枚举的数小于N了,那么枚举的这一位就可以任意,如果等于N

Gym 100418J Lucky tickets(数位dp)

题意:给定一个n,求区间[1, n]之间的所有的a的个数,a满足: a能整除  把a表示自身二进制以后1的个数 思路:题意很绕.... 数位dp,对于所有可能的1的个数我们都dfs一次 对于某一个可能的1的个数p来说,状态dp(len, i, j, k)里的每一位分别表示当前位,当前确定位的值模除p,已经有了多少个1,是否已经小于给定的n, 注意的是这题范围很大,要用unsigned long long 来定义n #include<cstdio> #include<cstring>

Lucky Tickets URAL - 1036 dp+大数

用b[i][j]表示递推到第i位时数字和为j的方案数,那么总方案数就是b[n][s/2]的平方 1 n, s = input().split(' ') 2 3 n = int(n) 4 s = int(s) 5 6 if s % 2 == 1: 7 print(0) 8 else: 9 s = int(s // 2) 10 b = [[]] 11 a = [] 12 for i in range(0, 10): 13 a.append(1) 14 for i in range(10, s + 1

Codeforces1096G Lucky Tickets(NTT优化dp)

设\(f[i][j]\)表示填了\(i\)个数,数位和为\(j\)的方案数 于是方程为: \[f[i][j]=\sum_{k=1}^9 f[i-1][j-k]*[CanUse[k]==1]\] 其中\(CanUse[i]\)表示是否可用\(i\)这个数字 最终答案为: \[\sum_{i=1}^{9*(n/2)}f[n/2][j]\] 直接转移肯定\(T\)飞,需要一些优化.于是我们观察到这个式子是卷积形式的式子,直接上\(NTT\)板子+快速幂即可 \(P.S.\)一些优化 可以把每个\(po

poj 2346 Lucky tickets

题目链接:http://poj.org/problem?id=2346 思路:     使用动态规划解法: 设函数 d( n, x )代表长度为n且满足左边n/2位的和减去右边n/2位的和为x的数的数目. 将一个长度为n的数看做n个数字 A1, A2....An ( 0 <= Ai <= 9  ),将字符分为两个集合{ A1, A2....An/2 } 与 { An/2+1.....An }; 问题转换为求集合中元素和相等的数目.先从每个集合中选出一个元素,求它们差为a的可能数目,即d( 2,

URAL 1035 Lucky Tickets

题意:长度为2n的数字,前N位之和和后面的一样,,,加一起是s........问有多少种不同的数字 首先s是奇数肯定就不行了.... 然后n*2*9<s也不行了...... dp[i][j]+=dp[i-1][j-k];就是加的这位不同的情况·~~~ 这题要用高精度,,,, #include<stdio.h> #include<string.h> #include <algorithm> #include <bits/stdc++.h> using n