算法 ccf acm-有趣的数 算法的题 求思路

问题描述

有趣的数 算法的题 求思路

问题描述
我们把一个数称为有趣的,当且仅当:
1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
3. 最高位数字不为0。
因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
输入格式
输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。
输出格式
输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。
样例输入
4
样例输出
3

答案:
import java.util.*;

public class Main {
public static void main(String[] args) {
new Main().run();
}

public void run() {
Scanner fin = new Scanner(System.in);

int N = fin.nextInt();
long[] count = new long[8];
count[6] = 0;
count[7] = 1;
long mod = 1000000007; for (int i = 2; i <= N; ++i) {
long[] newCount = new long[8];
newCount[0] = (count[0] * 2 + count[1] + count[3]) % mod;
newCount[1] = (count[1] * 2 + count[2] + count[5]) % mod;
newCount[2] = (count[2] + count[6]) % mod;
newCount[3] = (count[3] * 2 + count[4] + count[5]) % mod;
newCount[4] = (count[4] + count[7]) % mod;
newCount[5] = (count[5] * 2 + count[6] + count[7]) % mod;
newCount[6] = 0;
newCount[7] = 1;

count = newCount;
}

System.out.println(count[0]);
}
}

看不懂 求救 到底是什么思路

解决方案

其实算法很简单。

(需要一个假设前提,这个在题目中没有说清楚,会造成一些漏洞。
假设是N进制,否则当 N >10时,会出现 9,10,11,12, 这样数字,排列时需要考虑 10 这个十进制数时,没有任何符合条件的组合。)

恰好有n位的有趣的数的个数 为 (N-2)(N-1)/2

当 N = 4 时, 0,1,2,3 共有 (4-2)(4-1)/2 = 3 个数。

解决方案二:

推导出递推公式:
Fn+1=2Fn+(n-2)*(2^(n-1)-1)

解决方案三:

用字符串记录这个正整数,顺序生成所有可能的数字,然后挨个判断,合格的记录下来,记数加一。

解决方案四:

思路:

如果用程序变量去存储,有可能数字会很大,计算时间会很长。
考虑用大学里学的线性代数和概率来解决此问题。

解决方案五:

纠正一下,

正确的公式是 ** (N-2)! * (N-2)(N-1)/2**

公式的推导是:

一共N个数字,0,1,2,....N
这样除了 0,1 之外,还有 N-2 个数字。 把这 N-2 个数字排列好,则有 (N-2)! 个排列。
然后将0 在 (N-2) 这个排列中找一个位置放入,比如可以放在右起第1个数字后,可以放在第2个数字后,.... 可以放在第N-2个数字后。,则有 N-2 种放法。
假设"0" 放在了第M个数字后, M = (1...N-2) ,那么"1" 能放在位置则必须是否“0”之后,即可以有 M 种放法。这样,当M=1 时,"1" 有1种放法,M=2 时 "1" 有2种放法,...当M=N-2 时,"1" 有N-2种放法, 这个和是 1+2+3+....+(N-2) = (N-2) (N-1)/2
也就是"0","1" 一共有 (N-2) (N-1)/2 放法。
再乘上原来N-2数字的排列,则一共有 ** (N-2)! * (N-2)(N-1)/2**

4 个数字时 6
5 个数字时 36

其实算法很简单。

(需要一个假设前提,这个在题目中没有说清楚,会造成一些漏洞。
假设是N进制,否则当 N >10时,会出现 9,10,11,12, 这样数字,排列时需要考虑 10 这个十进制数时,没有任何符合条件的组合。)

恰好有n位的有趣的数的个数 为 (N-2)(N-1)/2

当 N = 4 时, 0,1,2,3 共有 (4-2)(4-1)/2 = 3 个数。

解决方案六:

推导出递推公式:
Fn+1=2Fn+(n-2)*(2^(n-1)-1)

解决方案七:

数组里的七个数都是什么意思?

解决方案八:

请问你这个答案是哪里的?我也正在纠结这道题

时间: 2024-10-24 09:19:02

算法 ccf acm-有趣的数 算法的题 求思路的相关文章

ccf-有趣的数 算法的题 求思路

问题描述 有趣的数 算法的题 求思路 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有一行,包括恰好一个正整数

求解acm题目,一直时间超限,求更优的算法

问题描述 求解acm题目,一直时间超限,求更优的算法 #include<cstdio> #include<cstring> int v[10000]; int a[10000]; int s; int check(int k) { for(int i=0;i<s;i++) if(k == a[i]) return 0; return 1; } void dfs(int t,int n,int k) { if(n==0){ if(check(k)){ a[s++] = k; /

自守数算法----C语言实现

#include <stdio.h> //自守数算法 //ep : 25 ^ 2 = 625 76 ^ 2 = 5776 9376 ^ 2 = 87909376 /*ep : * 376 被乘数 * *376 乘数 * ------ --------- * 2256 第一个部分积=被乘数*乘数的倒数第一位 * 2632 第二个部分积=被乘数*乘数的倒数第三位 * 1125 第三个部分积=被乘数*乘数的倒数第三位 *-------- * 141376 将以上的部分积的后3位求和后截取后3位就是3

ACM STL容器和算法

1.4      STL 的组成 STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件.通俗的讲: 容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室--STL里的容器是可容纳一些数据的模板类. 算法:就是往杯子里倒水,往大海里排污,从教室里撵人--STL里的算法,就是处理容器里面数据的方法.操作. 迭代器:往杯子里倒水的水壶,

《算法基础》——1.4 算法的特点

1.4 算法的特点 一个好的算法必须具备三个特点:正确性,可维护性和效率.显然,如果一个算法不能解决问题,它就没什么用:如果它不能产生正确的答案,它就没有什么意义.注 有趣的是,一些算法只在某些时候产生正确的答案,但是它们仍然有用.例如,某个算法或许能给你一些有用的信息.这种情况下,你可以重复运行这个算法很多次,来让你确信某个答案是正确的.在2.4.3节中描述的费马素性测试(Fermat抯 primality test)就是这种算法.如果一个算法难以维护,在程序中使用它就是危险的.如果一个算法简

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何

【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码 3.机器学习之PageRank算法应用与C#实现(3)球队实力排名应用与C#代码  Pagerank是Google排名运算法则(排名公式)的一部分,是Google用于用来标识网页的等级/重要性的一种方法,是Google用来衡量一个网站的好坏的唯一标准.在揉合了诸如Title

基础算法题,求思路和代码

问题描述 基础算法题,求思路和代码 问题 E: L1-6. 连续因子 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入 输入在一行中给出一个正整数N(1<N<231). 输出 首先在第1行输出最长连续因子的个数:然后在第2行中按"因子1*因子2*--*因子k"的格式

模拟退火算法优化BP神经网络函数拟合源程序,急求,毕设用 matlab

问题描述 模拟退火算法优化BP神经网络函数拟合源程序,急求,毕设用 matlab 想用模拟退火优化BP神经网络,但误差增大,急求解决. 主函数:需调用函数fx2.evaluate和errorBP clc clear %随机产生200组输入数据x.输出数据y input=10*rand(2,200)-5; output=zeros(1,200); for i=1:200 output(i)=fx2(input(:,i)); end %设置网络节点数 inputnum=2; hiddennum=5;