时间优化:集合题记

简介: 1.题目描述:

1.题目描述:

给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整 
数(若该数非零,则最高位不能是00)。用火柴棍拼数字0-90−9的拼法如图所示:(我直接把对应的火柴 
数写出来了)
6,2,5,5,4,5,6,3,7,6
注意
加号与等号各自需要两根火柴棍
如果a!=b则A+B=CA+B=C与B+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0)
nn根火柴棍必须全部用上
输入格式:
一个整数n(n<=24)n(n<=24)。
输出格式:
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1复制
14
输出 #1复制
2
输入 #2复制
18
输出 #2复制
9
说明/提示:
【输入输出样例1解释
22个等式为0+1=10+1=1和1+0=11+0=1
【输入输出样例2解释】
99个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11

分析:

结合下面的代码,我们慢慢分析,首先看备注释的部分代码,这部分代表直接计算0-24每一项所用到的火 
柴数,内层的循环中,1000的由来:按火柴数最少1111+1=1112在这时候所用到的数目是25,不符合范 
围,所以说4位数肯定不满足,所以我们a或者b的值遍历到1000就足够了。然后看下面代码的注释。
等到输出完之后,直接打表,就是下面的arr[25];
然后题目中输入a,就输出arr[a]。然后这道题就ac了。

源码:

#include <iostream>
using namespace std;
int pre[]={6,2,5,5,4,5,6,3,7,6};
int arr[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65,88,128};
int main(void)
{
int n;
cin>>n;
cout<<arr[n]<<endl;
//  for(int n=0;n<=24;n++)
//  {
//      int arr=0;
//      for(int i=0;i<=1000;i++)
//      {
//          for(int j=0;j<=1000;j++)
//          {
//              int sum=0;
//              int a=i,b=j,c=i+j;
//              if(a==0) sum+=6;  //因为a或b或c为零时,不会进入while循环中
//              if(b==0) sum+=6;
//              if(c==0) sum+=6;
//              while(a)
//              {//这个循环中就是基本的每位用到的火柴数
//                  sum+=pre[a%10];
//                  a=a/10;
//              }
//              while(b)
//              {
//                  sum+=pre[b%10];
//                  b=b/10;
//              }
//              while(c)
//              {
//                  sum+=pre[c%10];
//                  c=c/10;
//              }
//              if(sum==n-4)//sum没有算加号和等号一共4根。
//              {
//                  arr++;
//              }
//          }
//      }
//      cout<<arr<<',';//输出每一项的火柴数所能配成的等式。
//  }
return 0;
}

2.题目:

给定n个数,让你求这n个数的阶乘和对1e9+7取余为多少?
1<=n<=1e6
1<=a[i]<=1e5

分析:

直接计算的时间复杂度为O(n*m),其中m为max(a[i]),即1e11.

解决办法:

1.那没一个数的阶乘给存下来,a[i]代表的是i的阶乘对mod取余的结果。
2.可以通过O(max(a[i]))的时间复杂度求解出所有数的阶乘并存到a数组里。
3.对于每一次,我们输入x,那么对应的阶乘值就是a[x]。
4.这样实现每一次计算的复杂度为O(1)。
5.总体时间复杂度为O(n+max(a[i]))。

源码:

#include <iostream>
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+9;
long long pre[maxn];
int main()
{
    pre[1]=1;
for(int i=2;i<=100000;i++)
    {
        pre[i]=pre[i-1]*i;
        pre[i]=pre[i]%mod;
    }
int n;
cin>>n;
long long ans=0;
while(n--)
    {
int x;
cin>>x;
        ans+=pre[x];
        ans%=mod;
    }
cout<<ans<<endl;
return 0;
}


目录
相关文章
|
8月前
|
编译器 C++
我的C++奇迹之旅:值和引用的本质效率与性能比较1
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
8月前
|
存储 分布式计算 安全
我的C++奇迹之旅:值和引用的本质效率与性能比较2
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
3月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
69 5
|
3月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
48 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
3月前
计科一二班数据结构《实验十报告》参考答案
计科一二班数据结构《实验十报告》参考答案
22 0
计科一二班数据结构《实验十报告》参考答案
|
5月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
101 0
|
8月前
|
算法 Java 程序员
技术更新迭代与“八股文”知识库的清理与更新
随着互联网技术的不断更新迭代,曾经被认为是“标准答案”的观点和方法已经逐渐失去适应当前需求的能力,甚至被视为过时的做法。就拿最近的技术圈新闻来讲,在新的JDK版本中,Java编程引入了许多新的特性、工具和方法,使其变得更加简洁、高效和强大,但是之前的旧特性和方法也有许多被废弃了,比如曾经比较经典的偏向锁已经被废弃了,因此,个人觉得是时候对“八股文”进行一次知识库的清理和更新了。那么本文就来分享一下关于偏向锁被废弃以及个人对此的看法,并回顾一下自己的“八股文”知识库,以及技术更新迭代地时候我们要保持及时更新自己的知识储备。
124 2
技术更新迭代与“八股文”知识库的清理与更新
|
安全 Java Linux
正确认识及掌握时间的用法
时间是一个相对地区而言的概念,因此有一个基准地区,就是本初子午线穿过的地区。了解世界时间相关的概念可以更好地协调全球人们的活动,便于跨越不同地区的时差。比如按照UTC时区划分算,洛杉矶和北京 之间的时间差异是16个小时, 但是一旦洛杉矶启用了夏令时两者之间的时间差异只有15个小时,神奇吗?
368 0
正确认识及掌握时间的用法
|
安全 C++
CSDN三道简单题:合并检测、星期一、特别数的和
CSDN三道简单题:合并检测、星期一、特别数的和
139 0
CSDN三道简单题:合并检测、星期一、特别数的和
|
存储 Java 索引
【Java编程进阶】花费数小时,带你学透Java数组,这些常用方法你还记得吗?
数组在 Java 编程中是一个非常基础且重要的概念,简单来说,就是把具有相同数据类型的数据存储在地址连续的内存空间中,目的是在程序设计中方便这一类数据的管理。每一个内容都有编号,这个编号从 0 开始,称为数组下标。数组分为一维数组和二维数组,还有一些和数组相关的重要内容,例如数组中元素的查找,排序等,下面做详细的讲解。
107 0
【Java编程进阶】花费数小时,带你学透Java数组,这些常用方法你还记得吗?

热门文章

最新文章

下一篇
开通oss服务