输入有多组数据。
每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)
对应每一组输入,输出一行相应的密码。
6 18 15 21 13 25 27 5 1 10 100 1000 10000
418109877711037713937811 00010089410135017501
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> v = {1, 1};
for(int i = 2; i < 10001; ++i){
v.push_back((v[i - 2] + v[i - 1]) % 10000);
}
int n, x;
while(cin >> n){
for(int i = 0; i < n; ++i){
cin >> x;
printf("%04d", v[x]);
}
printf("\n");
}
return 0;
} import java.util.*;
public class Main{
public static void main(String[] args){
int[] arr = new int[10001];
arr[1] = 1;
arr[2] = 2;
for(int i = 3;i < 10001;i++){
arr[i] = arr[i - 1] + arr[i - 2];
arr[i] = arr[i] % 10000;
}
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
StringBuffer sb = new StringBuffer();
int n = sc.nextInt();
for(int i = 0;i < n;i++){
int x = sc.nextInt();
sb.append(String.format("%04d",arr[x]));
}
System.out.println(sb);
}
}
}
详细解题:
https://fanxinglanyu.blog.csdn.net/article/details/104611998
星际密码
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
$$
例如n=2时,
即2对应的数是“0002”。
输入描述:
输入有多组数据。
每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)
输出描述:
对应每一组输入,输出一行相应的密码。
输入例子:
6
18 15 21 13 25 27
5
1 10 100 1000 10000
输出例子:
418109877711037713937811
00010089410135017501
求矩阵的n次方的结果的矩阵的左上角。
。。。
矩阵结果的左上角的值1、1、2、5、8、。。。,满足斐波那契数列。
#include <cstdio>
const int MAXN = 10010;
int f[MAXN] = {1,1,2};
int main(int argc, char const *argv[]){
int n;
for (int i = 3; i < MAXN; ++i) {
f[i] = (f[i -1] + f[i -2])% 10000;//递推式//f[20] = 10946
}
int x;
while(scanf("%d", &n) != EOF){
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
printf("%04d", f[x]);
}
printf("\n");
}
return 0;
}
#include<iostream>
(720)#include<vector>
#include<iomanip>
using namespace std;
/*
set A=|1 1| A^2=|2 1| A^3=|3 2| A^4=|5 3| A^5=|8 5|
|1 0| |1 1| |2 1| |3 2| |5 3|
事实上,实对称矩阵相乘仍然是实对称矩阵。观察易得,A^(n-1)由于左乘A(也可以右乘,此处举例左乘)
X1为上A^(n-1)的第一行元素相加 X2为A^(n-1)的第一个元素(左上角元素),由于对称X3和X2一样,
X4=A^(n-1)的第2个元素
迭代得到规律左上角元素X1[n]=X1[n-1]+X1[n-2] 为fb数列1 2 3 5 8
另外,不只是X1为此数列,其他所有元素都是这个数列
取4位只需%10000即可。
*/
int main() {
int n;
int index = 0;
vector<short int> code(10000, 0);
code[0] = 1;
code[1] = 2;
for (int i = 2; i < 10000; i++) {
code[i] = (code[i - 1] + code[i - 2])%10000;
}
while (cin >> n) {
for (int i = 0; i < n; i++) {
cin >> index;
cout << setw(4) << setfill('0') << code[index - 1];
}
cout << endl;
}
} #include<cstdio>
int main()
{
int n,fib[10001],i,x;fib[0]=1;fib[1]=1;
for(i=2;i<10001;i++) fib[i]=(fib[i-1]%10000+fib[i-2]%10000)%10000;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%d",&x);printf("%04d",fib[x]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>void data_init(int*a);int main(){int a[10001]={0,1,2};int n, t, i;data_init(a);while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%d",&t);printf("%04d",a[t]);}printf("\n");}return0;}void data_init(int*a){inti;for(i=3;i<10001;i++){a[i]=a[i-1]+a[i-2];if(a[i]>=10000){a[i]%=10000;}}}
#include <stdio.h>
int a[10005]={0,1,2,3,5};
void data_init()
{
int i;
for(i=3;i<10005;i++)
{
a[i]=a[i-1]+a[i-2];
if(a[i]>=10000) a[i]%=10000;
}
}
int main()
{
int n,t;
data_init();
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
scanf("%d",&t);
printf("%04d",a[t]);
}
printf("\n");
}
return 0;
}
/*矩阵是 |1 1|^2=|1 1|*|1 1|=|2 1|
// |1 0| |1 0| |1 0| |1 1|
n的取值:1 2 3 4 5 6 ....
左上角值:1 2 3 5 8 13 ....
又是变式的斐波那契!!!!!!!!!!!
*/
乍一看,感觉这道题不是一般的复杂,题目都有些没读懂。。。
我们先计算几个矩阵预算结果再说。
当n = 1时
|1 1| 左上角值 = 1
|1 0|
当n = 2时
|1 1|*|1 1|=|2 1| 左上角值 = 2
|1 0| |1 0| |1 1|
当n = 3时
|2 1|*|1 1|=|3 2| 左上角值 = 3
|1 1| |1 0| |2 1|
当n = 4时
|3 2|*|1 1|=|5 3| 左上角值 = 5
|2 1| |1 0| |3 2|
当n = 5时
|5 3|*|1 1|=|8 5| 左上角值 = 8
|3 2| |1 0| |5 3|
当n = 6时
左上角值 = 13 ? 从数据表现特征可以看出一个规律f(i) = f(i - 1) + f(i - 2) (当i ≥ 2时),
接着我们从矩阵运算的过程分析一下得出的规律是否正确。
矩阵运算规则:
|a11 a12|*|b11 b12|=|a11*b11+a12*b12 a11*b21+a12*b22| |a21 a22| |b21 b22| |a21*b11+a22*b12 a21*b21+a22*b22|
将b矩阵带入举证运算公式,可得:
f(n - 1) f(n) |a11 a12|*|1 1|=|a11+a12 a11| |a21 a22| |1 0| |a21+a22 a21|
也就是说,每次n加1,都是将f(n - 1)的结果进行上面的求和计算,
算出的结果表现的特征就是斐波拉契尔数列。
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
//建立一张表,用于记录斐波拉契尔数列的各项值
int fTable[10001] = {0, 1, 2};
for (int i = 3; i < 10001; ++i) {
fTable[i] = fTable[i - 1] + fTable[i - 2];
fTable[i] = fTable[i] % 10000;
}
int count = 0;
//scanf返回值为正确输出数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
while (scanf("%d", &count) != - 1) {
for (int i = 0; i < count; ++i) {
int number = 0;
scanf("%d", &number);
//“%04d”的作用是输出长度不少于4位,少于用0b填充
printf("%04d", fTable[number]);
}
printf("\n");
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int group = 0;
while (cin>>group)
{
while (group--)
{
long num = 0;
cin >> num;
if (num == 0 || num == 1)
{
printf("%0.4d", 1);
continue;
}
else
{
int i = 1;
int k = 1;
while (--num)
{
int tmp = (i + k)%10000;
i = k;
k = tmp;
}
printf("%0.4d", k);
}
}
cout<<endl;
}
return 0;
} 斐波那契数列算法,时间复杂度较高!// write your code here cpp
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
using namespace std;
int getXi(vector<vector<long long int>> a,vector<vector<long long int>>& b,int n){
//第一次循环 a,b均为 [1110]
vector<vector<long long int>> c(3,vector<long long int>(3,0));
while(--n){
for(int i=1;i<3;i++){//遍历第一行
for(int j=1;j<3;j++){ //遍历第一列 //
c[i][j]=(a[i][1]*b[1][j]+ //
a[i][2]*b[2][j])%10000;
}
}
a=c;
}
return a[1][1];
}
int main(){
vector<vector<long long int>> a={{0,0,0},
{0,1,1},
{0,1,0}};//矩阵
int n;
while(cin>>n){
while(n){
int xi;
cin>>xi;
long long int ret= getXi(a,a,xi);
printf("%04d",ret);
n--;
}
printf("\n");
}
//测试用例能过,
//but 提交会超时...
} public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] arr = new int[10001]; arr[1] = 1; arr[2] = 2; for (int i = 3; i < arr.length; i++) { arr[i] = (arr[i - 1] + arr[i - 2]) % 10000; } while(sc.hasNext()){ int n = sc.nextInt(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) { int x = sc.nextInt(); sb.append(String.format("%04d",arr[x])); } System.out.println(sb); } }
# include <iostream>;
using namespace std;
int func(int n);
int main()
{
int m,n,ret;
while(cin >> m)
{
for(int i = 0;i < m;++i)
{
cin >> n;
ret = func(n);
if(ret < 10)
{
cout << 0 << 0 << 0 << ret;
}
else if(ret < 100)
{
cout << 0 << 0 << ret;
}
else if(ret < 1000)
{
cout << 0 << ret;
}
else
{
cout << ret;
}
}
cout <<endl;
}
return 0;
}
int func(int n)
{
int a = 2,b = 1 ,c = 0;
if(n < 3)
{
return n == 2 ? a : n == 1 ? b : 0;
}
for(int i = 3;i <= n;i++)
{
c = b;
b = a;
a = (b + c)% 10000;
}
return a;
} #include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<int> v(n);
for(int i = 0; i < n; i++)
cin >> v[i];
int m0 = 0;
int m1 = 1;
for(int i = 0; i < n; i++)
{
m0 = 0;
m1 = 1;
while(v[i]--)
{
int tmp = m1;
m1 += m0;
m1 %= 10000;
m0 = tmp;
}
printf("%04d", m1);
}
cout << endl;
}
return 0;
}