zoukankan      html  css  js  c++  java
  • 周赛题解

    问题 A: 一道签到题

    时间限制: 2 Sec  内存限制: 128 MB
    提交: 62  解决: 27
    [提交][状态][讨论版]

    题目描述

    我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度

    输入

    输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100

    输出

    分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔

    样例输入

    8.6987698769876987
    0.666
    5.1

    样例输出

    4 6987 4
    1 6 3
    1 1 1
    题解:kmp;
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 char  m[210],s[210];
     4 int p[210],len;
     5 void fn(){
     6     int i=0,j=-1;
     7     p[0]=-1;
     8     while(i<len){
     9         if(j==-1||s[i]==s[j]){
    10             i++;j++;
    11             p[i]=j;
    12         }
    13         else j=p[j];
    14     }
    15 }
    16 int main(){
    17     while(~scanf("%s",m)){
    18         int i=0,j,k;
    19         while(m[i]!='.')i++;
    20         for(j=i+1,k=0;m[j];j++,k++){
    21             s[k]=m[j];
    22         }
    23         s[k]='';
    24         //printf("%s
    ",s);
    25         len=strlen(s);
    26         fn();
    27         //for(i=0;i<len;i++)printf("%d ",p[i]);puts("");
    28         printf("%d ",len-p[len]);
    29         for(j=p[len];j<len;j++)printf("%c",s[j]);
    30         printf(" %d
    ",len/(len-p[len]));
    31     }
    32     return 0;
    33 }
    View Code

    问题 B: MZY寻宝

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 157  解决: 49
    [提交][状态][讨论版]

    题目描述

    贪心的MZY去一个迷宫寻宝。已知:若MZY在位置(x, y),他下一次只能移动到(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1)四个位置中的任一个(前提不能越界)。
    毕竟他不是我,我可以直接飞到宝物那里去。由于MZY比较笨拙,他移动一步需要1分钟。请你帮他算出找到宝物所需要花费的最少时间。

    迷宫是一个N*M的地图,图中只有四个数字。
    0:此处是空的,可以走
    1:此处有障碍,不可以走
    2:MZY起点
    3:宝物位置(只有一个宝物)

    题目保证CZY至少有一条路可以到达宝物位置。

    输入

    输入数据有多组。

    每组以两个整数N和M开始,分别表示迷宫的行数和列数,接下来N行每行有M个数。(1 <= N, M <= 10)

    输出

    输出MZY找到宝物的最少需要花费的时间。(以秒为单位)

    样例输入

    2 2
    0 2
    1 3

    样例输出

    60
    
    
    题解:错了12次终于交对了,尝试了各种方法,刚开始广搜,wa然后再用深搜还是wa换了种深搜写法不用数组了,然后就一直运行错误,跟魔王那题一样老是运行错误
    都无奈了,然后又用广搜,换了种写法,用优先队列重新写也不管超内存了,然后就过了。。。曲折淋漓啊; dfs代码:
     
     1 #include<stdio.h>
     2 #define MIN(x,y) x<y?x:y
     3 int map[15][15];
     4 int nx,ny,minstep,N,M,sx,sy;
     5 void dfs(int x,int y,int step){
     6     if(x<0||y<0||x>=N||y>=M||map[x][y]==1)return;
     7     if(step>minstep)return;
     8     if(map[x][y]==3){
     9         minstep=MIN(minstep,step);
    10         return;
    11     }
    12     map[x][y]==1;
    13     dfs(x+1,y,step+1);
    14     dfs(x-1,y,step+1);
    15     dfs(x,y+1,step+1);
    16     dfs(x+1,y-1,step+1);
    17     map[x][y]=0;
    18     return;
    19 }
    20 int main(){
    21     while(~scanf("%d%d",&N,&M)){minstep=0xfffffff;
    22         for(int i=0;i<N;i++){
    23             for(int j=0;j<M;j++){
    24                 scanf("%d",&map[i][j]);
    25                 if(map[i][j]==2)sx=i,sy=j;
    26             }
    27         }
    28         dfs(sx,sy,0);
    29         printf("%d
    ",minstep*60);
    30     }
    31     return 0;
    32 }
    View Code

    bfs代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 using namespace std;
     5 struct Node{
     6     int nx,ny;
     7     int step;
     8     friend bool operator < (Node a,Node b){
     9         return a.step>b.step;
    10     }
    11 };
    12 Node a,b;
    13 int map[11][11],N,M;
    14 int visit[11][11];
    15 int disx[4]={0,0,1,-1};
    16 int disy[4]={1,-1,0,0};
    17 int st,sx,sy,flot;
    18 void bfs(){int t;
    19     priority_queue<Node>dl;
    20     a.nx=sx;a.ny=sy;a.step=0;
    21     dl.push(a);
    22     visit[sx][sy]=1;
    23     while(!dl.empty()){
    24         a=dl.top();
    25             dl.pop();
    26             if(map[a.nx][a.ny]==3){
    27             st=a.step;
    28             return;
    29             }
    30             visit[a.nx][a.ny]=1;
    31         for(int i=0;i<4;i++){
    32             b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+1;
    33             if(b.nx<0||b.ny<0||b.nx>=N||b.ny>=M||visit[b.nx][b.ny])continue;
    34             if(map[b.nx][b.ny]==1)continue;
    35             if(map[b.nx][b.ny]==0||map[b.nx][b.ny]==3){
    36                 dl.push(b);
    37             }
    38         }
    39     }
    40 }
    41 int main(){int x,y;
    42     while(~scanf("%d%d",&N,&M)){st=0;
    43     memset(map,0,sizeof(map));
    44     memset(visit,0,sizeof(visit));
    45         for(x=0;x<N;x++)for(y=0;y<M;y++){
    46             scanf("%d",&map[x][y]);
    47             if(map[x][y]==2)sx=x,sy=y;
    48         }
    49         bfs();
    50         printf("%d
    ",st*60);
    51     }
    52     return 0;
    53 }
    View Code

    问题 C: CZY的组合数烦恼

    时间限制: 3 Sec  内存限制: 128 MB
    提交: 46  解决: 21
    [提交][状态][讨论版]

    题目描述

    czy最近对组合数产生了浓厚的兴趣,一天他心血来潮,想排n个数字,但是很快他发现种类太多了,于是他决定从中随机找出m个数排,但还是太多了,所以他想请聪明的你写个程序帮助他找到所有种类的排列

    输入

    输入包括多组测试数据,每组包括一行整数n(1<=n<10),m(1<=m<=n),空格间隔

    输出

    按特定顺序输出所有组合。
    特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。

    样例输入

    5 3

    样例输出

    543
    542
    541
    532
    531
    521
    432
    431
    421
    321
    题解:不多说南阳组合数;
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int n,m;
     4 int num[10];
     5 void dfs(int top,int tot){
     6     if(tot>=m){
     7         for(int i=0;i<m;i++)printf("%d",num[i]);
     8         puts("");
     9         return;
    10     }
    11     for(int i=top;i>0;i--){
    12         num[tot]=i;
    13         dfs(i-1,tot+1);
    14     }
    15     return ;
    16 }
    17 int main(){
    18     while(~scanf("%d%d",&n,&m)){
    19         dfs(n,0);
    20     }
    21     return 0;
    22 }
    View Code

    问题 E: 陈公公找女友

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 44  解决: 17
    [提交][状态][讨论版]

    题目描述

    话说CZY来到了HPU之后,每天对着电脑码代码,码了一学期了,陈公公有一天敲代码敲累了,此刻的陈公公是身心疲惫啊,他突然想:要是有一个Girlfriend多好?于是,陈公公想要在学校找一个Girlfriend。话说在男女比7:1的比例之下很难找到意中人,是不是?可惜这难不倒我们“英(jing)姿(li)飒(feng)爽(fu)”的陈公公,找女友要先买礼物对吧。对于陈公公这种“壕”,当然要买高端大气上档次的啦!陈公公要斥巨资买条钻石手链,送给他心仪已久的女生(从此,陈公公又多了个外号“钻石陈”)。我们都知道手链五颜六色的很吸引人。陈公公也知道女生喜欢颜色比较多的手链,但是手链又不能毫无规律的颜色多而已。我们要买的手链必须是颜色够多,还要有规律,什么叫做有规律?就是有循环的。假如给定参照手链“RGB”,再给一个手链比如“RGBRGBRGB”它包含了3个参照手链。陈公公称包含值为:美丽度。因为包含3个参考串,所以这个手链美丽度就为3.

    陈公公想要买一个美丽度大于1的手链,但是又不能只有一种颜色,怎么挑一个最好的呢?这个问题有点难想,并且可惜陈公公对颜色的分辨能力不够高(轻微色盲),不能很好的判断买哪一条手链,要不是陈公公自己都能编程解决这个问题了。陈公公很无奈啊,他想到了有爱心的协会成员,希望求助协会成员,请你帮他选一个最美的手链。这关乎到陈公公能否追到心意的女孩啊!人生大事啊!陈公公说了,能帮他解决这个问题的童鞋,他就会请你吃饭!PS:帮陈公公解决这个问题的人,记得找陈公公请客。

    输入

    有多组测试数据,输入先给出参考手链(参考手链长度大于1),然后输入一个T(0<T<20),代表陈公公选的T组数据。每组数据第一行是参照手链,第二行是陈公公想知道美丽度的手链(长度不小于参考手链)。由于陈公公比较壕,所以他选的手链的珠子最多可以达到100000。

    输出

    输出数据也有T行,每行输出,最大美丽度,和相应的手链。如果美丽度相同就输出手链最长的,看下面测试样例。

    样例输入

    RGB
    4
    RGBRGB
    RGBRGBRGB
    RGBWRGBWRGBW
    RGRGBRGGRBG
    
    RWW
    3
    RWWWWR
    RWWWWRW
    RWRWRW
    
    WWR
    5
    WWRWW
    WWWRWWRWR
    WWWWWWWW
    WRWRWRWR
    WRRWRWRWWW
    

    样例输出

    3 RGBWRGBWRGBW
    1 RWWWWRW
    2 WWWRWWRWR
    
    题解:基础kmp;
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 struct Node{
     6     char a[100010];
     7     int buty;
     8     int len;
     9 };
    10 Node da[25];
    11 int cmp(Node a,Node b){
    12     if(a.buty!=b.buty)return a.buty>b.buty;
    13     else return a.len>b.len;
    14 }
    15 int p[100010],flot;
    16 char b[100010];
    17 void fp(){
    18     int i=0,j=-1;
    19     p[0]=-1;
    20     while(b[i]){
    21         if(j==-1||b[i]==b[j]){
    22             i++;j++;
    23             p[i]=j;
    24         }
    25         else j=p[j];
    26     }
    27 }
    28 void kmp(char *a,int x){
    29     fp();
    30     int j=0;
    31     while(a[x]){
    32         if(j==-1||a[x]==b[j]){
    33             x++;j++;
    34             if(!b[j]){flot++;
    35                 kmp(a,x);
    36                 return;
    37             }
    38         }
    39         else j=p[j];
    40     }
    41 }
    42 int main(){
    43     int T;
    44     while(~scanf("%s",b)){
    45         memset(da,0,sizeof(da));
    46         memset(p,0,sizeof(p));
    47         scanf("%d",&T);
    48         for(int i=0;i<T;i++){
    49             scanf("%s",da[i].a);
    50             da[i].len=strlen(da[i].a);
    51             flot=0;
    52             kmp(da[i].a,0);
    53             da[i].buty=flot;
    54         }
    55         sort(da,da+T,cmp);
    56         printf("%d %s
    ",da[0].buty,da[0].a);
    57     }
    58     return 0;
    59 }
    View Code

    问题 G: 打败魔王

    时间限制: 2 Sec  内存限制: 128 MB
    提交: 43  解决: 6
    [提交][状态][讨论版]

    题目描述

    可怜的公主又被魔王抓走了。魔王这次准备在T时刻与公主成亲,不过公主深信智勇的骑士CZY肯定能将她救出。
    已知:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。
    CZY一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那CZY就会被撞死。
    CZY在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

    输入

    输入有多组测试数据。
    每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。
    接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

    输出

    如果CZY能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

    样例输入

    1 4 2
    .#.#
    
    *.#P

    样例输出

    NO
    
    
    
    
    
    
    
    
    题解:比赛的时候最后看dfs实在不行就敲了广搜,敲完时间也到了,不知道对不,应该问题不大,两个代码贴上;
    dfs:
     1 #include<stdio.h>
     2 #define MIN(x,y) x<y?x:y
     3 const int INF=0xfffffff;
     4 char map[2][12][12];
     5 int nx,ny,nz,mt,N,M,flot,T;
     6 char p;
     7 void dfs(int x,int y,int z,int t){
     8     if(x<0||y<0||x>=N||y>=M||map[z][x][y]=='*')return;
     9     if(map[z][x][y]=='P'){
    10         if(t<=T)flot=1;
    11         return;
    12     }
    13     if(flot)return ;
    14     if(map[z][x][y]=='#')dfs(x,y,1-z,t);
    15     map[z][x][y]='*';
    16     dfs(x+1,y,z,t+1);
    17     dfs(x-1,y,z,t+1);
    18     dfs(x,y+1,z,t+1);
    19     dfs(x,y-1,z,t+1);
    20     map[z][x][y]='.';
    21     return;
    22 }
    23 int main(){
    24     while(~scanf("%d%d%d",&N,&M,&T)){
    25         flot=0;
    26         for(int x=0;x<N;x++)scanf("%s",map[0][x]);
    27         for(int x=0;x<N;x++)scanf("%s",map[1][x]);
    28         //printf("%s %s
    ",map[0][0],map[1][0]);
    29         dfs(0,0,0,0);
    30         if(flot)puts("YES");
    31         else puts("NO");
    32     }
    33     return 0;
    34 }
    View Code

    bfs:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 using namespace std;
     5 struct Node{
     6     int nx,ny,nz;
     7     int step;
     8     friend bool operator < (Node a,Node b){
     9         return a.step>b.step;
    10     }
    11 };
    12 Node a,b;
    13 char map[2][11][11];
    14 int visit[2][11][11];
    15 int disx[4]={0,0,1,-1};
    16 int disy[4]={1,-1,0,0};
    17 int st,sx,sy,flot,N,M,T;
    18 void bfs(){int t;
    19     priority_queue<Node>dl;
    20     a.nx=0;a.ny=0;a.step=0;a.nz=0;
    21     dl.push(a);
    22     visit[0][sx][sy]=1;
    23     while(!dl.empty()){
    24         a=dl.top();
    25             dl.pop();
    26             if(map[a.nz][a.nx][a.ny]=='P'){
    27         if(a.step<=T)flot=1;
    28         //printf("%d
    ",a.step);
    29             return;
    30             }
    31             visit[a.nz][a.nx][a.ny]=1;
    32         for(int i=0;i<4;i++){
    33             b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+1;b.nz=a.nz;
    34             if(b.nx<0||b.ny<0||b.nx>=N||b.ny>=M||visit[b.nz][b.nx][b.ny])continue;
    35             if(map[b.nz][b.nx][b.ny]=='*')continue;
    36             if(map[b.nz][b.nx][b.ny]=='#')b.step=a.step+1,b.nz=1-b.nz,dl.push(b);
    37             else if(map[b.nz][b.nx][b.ny]=='.'||map[b.nz][b.nx][b.ny]=='P'){
    38                 dl.push(b);
    39             }
    40         }
    41     }
    42 }
    43 int main(){int x,y;
    44     while(~scanf("%d%d%d",&N,&M,&T)){flot=0;
    45     memset(map,0,sizeof(map));
    46     memset(visit,0,sizeof(visit));
    47         for(x=0;x<N;x++)scanf("%s",map[0][x]);
    48         for(x=0;x<N;x++)scanf("%s",map[1][x]);
    49         bfs();
    50         if(flot)puts("YES");
    51         else puts("NO");
    52     }
    53     return 0;
    54 }
    View Code
     

    问题 H: CZY的工程

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 68  解决: 36
    [提交][状态][讨论版]

    题目描述

    CZY总是遇到这样或那样的问题,现在他又遇到了一个,CZY接到一个大的工程,想想这是走上人生巅峰的第一步啊,CZY想想就高兴,可是这个工程太大了,他需要很多人的帮助才可以,但是为了方便工作,CZY希望他的团队两人两人之间都是朋友关系,或者间接是朋友关系。毕竟是大油水的工程啊,来了一群小伙伴报名,CYZ想请聪明的你帮忙算一算,他可以招到的最大的人数是多少

    输入

    输入包含多组测试数据,每组测试数据第一行一个n,表示来报名的小伙伴们的编号1-100,后边接n行,每行两个整数a b,表示编号a和b的小伙伴是朋友关系

    输出

    输出包括一行,即CZY可以招到的最大的人数是多少

    样例输入

    4
    1 2
    3 4
    5 6
    1 6

    样例输出

    4

    题解:基础并查集,记录节点数;

    代码:

     1 #include<stdio.h>
     2 #define MAX(x,y) x>y?x:y
     3 const int INF=-0xfffffff;
     4 int pre[120];
     5 int py[120];
     6 int max;
     7 int find(int x){
     8     if(x==pre[x])return x;
     9     else return pre[x]=find(pre[x]);
    10 }
    11 void initial(){
    12     for(int i=1;i<=100;i++)pre[i]=i,py[i]=1;
    13 }
    14 void merge(int x,int y){
    15     int f1,f2;
    16     f1=find(x);f2=find(y);
    17     if(f1!=f2){
    18         pre[f1]=f2;
    19         py[f2]+=py[f1];
    20         max=MAX(max,py[f2]);
    21     }
    22 }
    23 int main(){
    24     int N,a,b;
    25     while(~scanf("%d",&N)){
    26         max=INF;
    27         initial();
    28         while(N--){
    29             scanf("%d%d",&a,&b);
    30             merge(a,b);
    31         }
    32         printf("%d
    ",max);
    33     }
    34     return 0;
    35 }
    View Code

    问题 I: CZY找句子

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 85  解决: 38
    [提交][状态][讨论版]

    题目描述

    YY喜欢读书,而且总是喜欢从书上摘取好的句子或词语,但是抄完之后她变忘了在哪,于是她就请CZY帮她,CZY感觉这我多我可咋找啊!
    于是又来麻烦聪明的你,为了方便CZY早已用高端译码机器把句子变成的数字,他想让你告诉他句子在文章中出现的位置。(位置从1开始)

    输入

    输入包括多组测试数据,每组测试数据包含三行,第一行包含两个整数n(1<=n<=1000000),m(1<=m<=1000),分别代表文章的长度,和所摘取的句子的长度,
    第二行包含n个整数表示文章,第三行包括m各整数表示句子

    输出

    输出所摘取的句子在文章中的位置

    样例输入

    13 5
    1 2 1 2 3 1 2 3 1 3 2 1 2
    1 2 3 1 3

    样例输出

    6
    
    
    
    题解:kmp模板: 代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int a[1000010],b[1010];
     4 int p[1010],n,m;
     5 void getp(){
     6     int i=0,j=-1;
     7     p[0]=-1;
     8     while(i<m){
     9         if(j==-1||b[i]==b[j]){
    10             i++;j++;
    11             p[i]=j;
    12         }
    13         else j=p[j];
    14     }
    15 }
    16 int kmp(){
    17     getp();
    18     int i=0,j=0;
    19 //    printf("%d
    ",n);
    20     while(i<n){
    21         if(j==-1||a[i]==b[j]){
    22             i++;j++;
    23             if(j>=m)return i-j+1;
    24         }
    25         else j=p[j];
    26     }
    27 }
    28 int main(){
    29     int t;
    30     while(~scanf("%d%d",&n,&m)){
    31         memset(p,0,sizeof(p));
    32         for(int i=0;i<n;i++)scanf("%d",&a[i]);
    33         for(int i=0;i<m;i++)scanf("%d",&b[i]);
    34         t=kmp();
    35         //for(int i=0;i<m;i++)printf("%d ",p[i]);puts("");
    36         printf("%d
    ",t);
    37     }
    38     return 0;
    39 }
    View Code

    问题 F: CZY的YY难题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 6  解决: 1
    [提交][状态][讨论版]

    题目描述

    CZY终于又和萌妹子的关系又进了一步,终于知道了妹子的名字,原来她叫YY,CZY跟着那个女孩也学到了很多的数学知识,CZY感觉自己快要超神了,于是嘚瑟起来,YY对此不屑一顾,冷笑一声“呵呵”后,便给CZY出了一道数学题,YY给了CZY一个数n,又给了m个数,让他从中找一些数,让这些数的和等于n,并让他把所有的情况写出来。这下可把CZY给打击到了,于是他又来请教聪明的你,请你帮帮他

    输入

    题目包含多组测试数据,每组测试数据包含两行,第一行包含两个整数n,m(1<=n,m<1000)

    第二行包含m个数

    输出

    按从大到小的顺序输出所有符合的情况,没有符合的情况就输出NONE

    样例输入

    4 6
    4 3 2 2 1 1
    5 3
    2 1 1
    400 12
    50 50 50 50 50 50 25 25 25 25 25 25
    

    样例输出

    4
    3+1
    2+2
    2+1+1
    NONE
    50+50+50+50+50+50+25+25+25+25
    50+50+50+50+50+25+25+25+25+25+25
    
    
    题解:
    跟交换卡片那题有点像,关键在于去冲重,用while去重;
    代码:
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int me[1010],str[1010];
     4 int m,n,flot;
     5 int cmp(const void *a,const void *b){
     6     return (int *)a>(int *)b;
     7 }
     8 void dfs(int top,int tot,int sum){
     9     if(sum==n){
    10         for(int i=0;i<tot;i++){flot=1;
    11             if(i)printf("+");
    12             printf("%d",str[i]);
    13         }puts("");
    14         return;
    15     }
    16     for(int i=top;i<m;i++){
    17         str[tot]=me[i];
    18         dfs(i+1,tot+1,sum+str[tot]);
    19         while(me[i]==me[i+1]&&i<m)i++;
    20     }
    21     return;
    22 }
    23 int main(){
    24 while(~scanf("%d%d",&n,&m)){flot=0;
    25     for(int i=0;i<m;i++)scanf("%d",&me[i]);
    26     qsort(me,m,sizeof(me[0]),cmp);
    27     dfs(0,0,0);
    28     if(!flot)puts("NONE");
    29 }
    30 return 0;}
    View Code

    问题 D: CZY追女孩

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 106  解决: 19
    [提交][状态][讨论版]

    题目描述

    CZY遇到了一个萌妹子,他使出浑身解数想要博得她的好感,但是妹子居然是个数学学霸!一天,那个女孩在解数列问题时遇到了一点麻烦,她有数列的前3项,数列不是等比数列就是等差数列,她很想知道这个数列的第n项是什么,但是n可能很大,她算不出来,CZY很想帮她,可是CZY是个学渣,于是想请聪明的你来帮忙求出数列的第n项,由于数据可能太大了,最后的结果对200907取余就好

    输入

    输入包含多组测试数据,每组测试数据包含4个整数,前三个整数是数列的前三项,最后一个数是n,四个数的范围都是1~10^9

    输出

    输出这个数列的第n项%200907

    样例输入

    1 2 3 5
    1 2 4 5

    样例输出

    5
    16
    题解:
    快速幂,同余定理;
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 int quikpow(int x,int y){
     5     int ans=1;
     6     while(y){if(y&1)ans*=x;
     7             x*=x;
     8             x%=200907;
     9         y>>=1;
    10     }
    11     return ans;
    12 }
    13 int main(){int x,y,z,n,tot,d,an,a1,q,anser;
    14 while(~scanf("%d%d%d%d",&x,&y,&z,&n)){
    15     if(x+z==2*y){d=y-x;a1=x;tot=n-1;
    16         d%=200907;
    17         a1%=200907;
    18         tot%=200907;
    19         an=a1+tot*d;
    20         printf("%d
    ",an%200907);
    21     }
    22     else{
    23         q=y/x;
    24         a1=x%200907;
    25         anser=a1*quikpow(q,n-1);
    26         printf("%d
    ",anser%200907);
    27     }
    28 }
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    day33-1 线程队列
    day32-4 GIL全局解释锁
    day32-3 阻塞非阻塞同步异步&异步回调
    day32-2 线程池与进程池
    day32-1 事件Event
    Chrome设置--disable-web-security解决跨域问题
    去除系统部分属性触摸是出现的色值
    初始化一个React项目
    ## normalize.css 中文版
    vue组件的3种书写形式
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4713228.html
Copyright © 2011-2022 走看看