摘要:
思路:刚开始想复杂了。看解题报告后才知道这题挺简单的,看来还是要多训练啊!!!单独处理首位的数字,不能为0.其他的就好处理了,从大到小依次找下去就可以了……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 100000511 using namespace std;12 char a[MAX],b[MAX];13 int c[11],d[11];14 int fi 阅读全文
摘要:
思路:容易知道,分解成素数的lcm肯定是最大的,因为假设分解成2个合数,设定x为他们的 最大公约数,那么他们的最小公倍数就要减少x倍了 然后如果是素数之间的最小公倍数,那么就只是他们的乘积,同样的n分解,没有 除的肯定比有除的大,因此可以得到结论 所以可以先晒一次素数,然后用这些素数填满那个n 这里填满也很容易想到是背包问题了,因为同一个素数可以用几次,所以就是一个 典型的多重背包了,就是dp[j] = lcm(dp[j - k] , dp[k]); 然后还有一个问题,就是对于所有素数取lcm,会导致结果很大,超int的 而且虽然有取mod,那么转移方程变为dp[j] = dp[j - k] 阅读全文
摘要:
数位DP!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 ll dp[22][15][200];13 int bit[22];14 ll dfs(int pos,int mod,int sum,bool f)15 {16 if(pos==-1) return mod==0;17 i... 阅读全文