試合コードネット試験(20151030巻)


日付カウントダウン
TimeLimit: 2000/1000 MS (Java/Others) MemoryLimit: 65536/65536 K (Java/Others)
ProblemDescription:
経済、科学技術がますます発達している今日、人々の時間に対する把握はますます厳しくなり、一定の影響力のある会社の役員にとって、彼は自分のスケジュールを来月まで繰り上げるかもしれません.普通の人にとって、彼は数日後の手配を早めにしたかもしれない.
今日が未来のある日まであと何日残っているかを計算するプログラムを設計してください.
今日が2015年10月18日だと仮定します.
入力
日付が今日より小さいかどうかを考慮せずに、yyyy-MM-ddとして入力します.
しゅつりょく
今日(2015年10月18日)の日付まで何日残っているかを示す数字を出力します.
 
サンプル入力
2015-10-19
サンプル出力
1
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define LL __int64
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inline bool judge(int x)
{
    if(x%400==0 || (x%4==0&&x%100!=0))
        return true;
    else return false;
}
int main()
{
    int YY=2015,MM=10,DD=18;
    int yy,mm,dd;
    while(scanf("%d-%d-%d",&yy,&mm,&dd)!=EOF)
    {
        if(yy<=YY)
        {
            if(yy<YY) {printf("0
");continue;} else { if(mm<=MM) { if(mm<MM) {printf("0
");continue;} else { if(dd<=DD) {printf("0
");continue;} } } } } int ans=0,ans1=291; for(int i=2015;i<yy;i++) { if(judge(i)) ans++; ans+=365; } for(int i=1;i<mm;i++) { ans+=m[i]; } ans+=dd; if(mm>2&&judge(yy)) ans++; if(ans-ans1>0) printf("%d
",ans-ans1); } return 0; }

 
 
太鼓を打って花を伝える
TimeLimit: 2000/1000 MS (Java/Others) MemoryLimit: 65536/65536 K (Java/Others)
ProblemDescription:
学校の交歓パーティーの時、学生一人一人が参加できるように、司会者はよく学生たちを連れて太鼓を打って花を伝えるゲームをします.ゲームのルールはこうです:n人の学友は座って1つの円を囲んで、1人の学友の手に1束の花を持っていることを指定して、司会者はそばでみんなに背を向けて太鼓を打ち始めて、太鼓の音が始まってから花を持っている学友は花を伝え始めて、すべての学友はすべて花を自分の左右の2人の学友の中の1つ(左右任意)に伝えることができて、司会者が太鼓を打つことを停止する时、花を伝えて停止して、この时、花を持って伝わっていない同級生はみんなに番組を披露しなければならない.賢い明ちゃんは面白い質問をしました.明ちゃんの手から伝わる花を、m回伝えた後、明ちゃんの手に戻す方法はいくつありますか.伝達方法については、この2つの方法のうち、花を受け取った同級生がボールを受け取る順序で構成されたシーケンスが異なる場合にのみ、2つの花を伝える方法が異なると見なされる.例えば、3人の同級生が1番、2番、3番で、明ちゃんが1番だと仮定して、花が3回明ちゃんの手に戻る方法は1->2->3->1と1->3->2->1で、2種類あります.
入力
合計1行を入力し、スペースで区切られた2つの整数n,m(3<=n<=30,1<=m<=30)を入力します.
しゅつりょく
出力は1行で、問題の意味に合致するメソッド数を表す整数があります.
 
サンプル入力
3 3
サンプル出力
2
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL __int64

struct matrix
{
    LL mat[2][2];
};

matrix multiply(matrix a,matrix b)
{
    matrix c;
    memset(c.mat,0,sizeof(c.mat));
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            if(a.mat[i][j]==0)continue;
            for(int k=0;k<2;k++)
            {
                if(b.mat[j][k]==0)continue;
                c.mat[i][k]+=a.mat[i][j]*b.mat[j][k];
            }
        }
    }
    return c;
}

matrix quicklymod(matrix a,LL n)
{
    matrix res;
    memset(res.mat,0,sizeof(res.mat));
    for(int i=0;i<2;i++) res.mat[i][i]=1;
    while(n)
    {
        if(n&1)
            res=multiply(a,res);
        a=multiply(a,a);
        n>>=1;
    }
    return res;
}

int main()
{
    LL N,M;
    while(scanf("%I64d%I64d",&N,&M)!=EOF)
    {
        //3<=n<=30,1<=m<=30
        if(M==1){printf("0
");continue;} matrix ans; ans.mat[0][0]=2; ans.mat[0][1]=0; ans.mat[1][0]=2; ans.mat[1][1]=-1; ans=quicklymod(ans,M-1); printf("%I64d
",ans.mat[1][0]); } return 0; }

 
 
軍事訓練の隊列.
TimeLimit: 2000/1000 MS (Java/Others) MemoryLimit: 65536/65536 K (Java/Others)
ProblemDescription:
ある大学では学校が始まって軍事訓練の隊列訓練を行い、学生を最初から順番に番号をつけ、横隊に並べた.訓練のルールは以下の通りである.最初から1~2の报数を続けます...以降は1から2まで、1から3まで順番に行い、残りの人数が3人を超えないまで行う.
入力
第一行為グループ数N、次にN行の学生数、学生数は5000を超えない
しゅつりょく
出力はN行で、それぞれ入力した学生数に対応し、各行は残りの学生の最初の番号を出力し、番号の間にスペースがある.
 
サンプル入力
2
20
40
サンプル出力
1 7 19
1 19 37
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define LL __int64
int main()
{
    int T,N;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        int a[2510]={0};
        if(N<=3)
        {
            for(int i=1;i<N;i++)
            printf("%d ",i);
            printf("%d
",N); continue; } if(N==4){printf("1 3 4
");continue;} int num=1; a[1]=1; for(int i=2;;i++) { if(a[i-1]+2<=N) a[i]=a[i-1]+2; else break; } int len=N/2; if(N&1) {a[++len+1]='\0';} else { a[N/2+1]='\0';} int bo=1,cnt,p; while(len>3) { cnt=2; p=2; if(bo) //3 { cnt++; p++; // for(int i=3;i<=len;i++) { if(cnt==3){cnt=1;continue;} a[p++]=a[i]; cnt++; } a[p]='\0'; len=p-1; } else { for(int i=2;i<=len;i++) { if(cnt==2){cnt=1;continue;} a[p++]=a[i]; cnt++; } a[p]='\0'; len=p-1; } bo^=1; } for(int i=1;i<len;i++) printf("%d ",a[i]); printf("%d
",a[len]); } return 0; }