时间限制: 1 Sec 内存限制: 128 MB

题目描述

WAR大佬认为一个包含重复元素的集合认为是优美的,当且仅当集合中的元素的和等于他们的积。

求包含n个元素的优美的集合的个数。

WAR大佬当然会啊,他只是想考考你。

输入

一个正整数n(2<=n<=1000)

输出

一个数ans表示集合的个数

样例输入

5

样例输出

3

提示

1+1+1+2+5=1*1*1*2*5

1+1+1+3+3=1*1*1*3*3

1+1+2+2+2=1*1*2*2*2

dfs,注意题目说了必须要有重复元素

剪枝条件是后面每位都用当前数且exmul*幂大于exsum+和时

#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int maxn = 1005; ll fstpow(ll a,ll n) {
ll res = 1;
while(n) {
if(n&1)res*=a;
a*=a;
n>>=1;
}
return res;
} ll dfs(ll _digit,ll _num,ll _exmul,ll _exsum) {
_exmul*=_num;
_exsum+=_num;
if(_digit==1) {
if(_exmul==_exsum)return 1;
else return 0;
}
ll ans = 0;
for(ll i=_num;; i++) {
if(_exmul*fstpow(i,_digit-1)>_exsum+i*(_digit-1))break;
if(_digit==2&&_num==1)break;
ans+=dfs(_digit-1,i,_exmul,_exsum);
}
return ans;
} int main() {
// FILE();
// freopen("../../out.txt","w",stdout);
ll n;
scanf("%lld",&n);
if(n==2||n==3)printf("0\n");
else {
ll ans = 0;
ll digit = min(n,32ll);
ans=dfs(digit,1,1,n-digit);
printf("%lld\n",ans);
}
return 0;
}

最新文章

  1. 3-PHP全部编码UTF-8
  2. centos 搭建ftp服务器
  3. C#迭代重载等
  4. [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化
  5. 嵌入式平台使用gtest进行白盒测试
  6. vue2组件之select2调用
  7. 002Java概述
  8. VMware14 安装CentOS7 实现宿主机ping通虚拟机、虚拟机ping通宿主机、虚拟机能上网且能ping通百度
  9. Dubbo 源码分析 - SPI 机制
  10. CS Academy Sliding Product Sum(组合数)
  11. Android 页面跳转之生命周期调用顺序问题
  12. Uncontrolled memory mapping in camera driver (CVE-2013-2595)
  13. SpringBoot的日志
  14. JavaScript数组的五个迭代方法的简单实例
  15. 九个问题从入门到熟悉HTTPS
  16. (转载)gcc &amp; gdb &amp; make 定义与区别
  17. Vim技能修炼教程(2) - 语法高亮速成
  18. 数组类型参数传递问题:$.ajax传递数组的traditional参数传递必须true
  19. 安装saltstack-web管理界面
  20. BLE(Bluetooth Low Energy)---first part

热门文章

  1. .NET轻量级任务管理类
  2. 【转】git shell 命令大全
  3. linux下在root用户登陆状态下,以指定用户运行脚本程序实现方式
  4. LVM实现逻辑卷镜像
  5. mini dc与简易计算器 20165235
  6. 简单的使用Nginx框架搭建Web服务器~
  7. html-伪类
  8. GIT结合android studio使用总结
  9. python request 库
  10. Windows 7 下如何配置 java 环境变量