网易编程:魔力手环

来源:互联网 发布:js 获取iframe 对象 编辑:程序博客网 时间:2024/05/09 18:51

1、魔力瘦环

小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。 

输入描述:
输入数据包括两行:第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99.

因k值范围很大,用快速幂矩阵相乘方法代替原来的普通循环。首先先定义一个单元矩阵,和矩阵相乘方法。

import java.util.*;public class Main {public static int[][] Core(int[][]a,int[][]b){//矩阵相乘int row=a.length;//m*n--n*sint col=b[0].length;int colA=a[0].length;int[][] c=new int[row][col];for(int i=0;i<row;i++){for(int j=0;j<col;j++){for(int k=0;k<colA;k++){if(a[i][k]==0||b[k][j]==0) continue;c[i][j]+=a[i][k]*b[k][j];}if(c[i][j]>=100) c[i][j]%=100;}}return c;}    public static void main(String[] args){        Scanner in=new Scanner(System.in);       int n=in.nextInt();       int k=in.nextInt();       //利用快速幂的矩阵相乘       int[][] a=new int[1][n];       for(int i=0;i<n;i++){//用一个二维数组保存       a[0][i]=in.nextInt();       }                  //初始化单元矩阵       int[][] mul=new int[n][n];       for(int i=0;i<n;i++){       if(i<n-1){       mul[i][i]=1;       mul[i+1][i]=1;       }else{       mul[i][i]=1;       mul[0][i]=1;       }       }              /*        * 矩阵快速幂---二分搜索        */              for(;k>0;k=k>>1){//循环次数k,每次K右移,k=13(1011)-->当末尾为1时累乘       if((k&1)==1){       a=Core(a,mul);//矩阵相乘       }       mul=Core(mul,mul);//              }              for(int i=0;i<n-1;i++){       System.out.print(a[0][i]+" ");       }       System.out.print(a[0][n-1]);    }}




输出描述:
输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。

输入例子1:
3 21 2 3

输出例子1:

8 9 7
原创粉丝点击