2015年百度の星プログラム設計大会-資格試合【題解】
29892 ワード
1001大引越し
Accepts: 866
Submissions: 3804
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
最近、B工場は大きな引っ越しを組織し、すべての人が指示通りに指定された席に変えなければならない.指示の内容は、位置iに座っている人が位置jに移ることである.現在B工場にはN人がいて,1対1からNの位置にある.引っ越してからもいちいち対応していて、変わったのは順位だけです.
初めて引っ越した後、度熊は油断して、元の指示通りに引っ越しをするように要求した.そこで、機知に富んだそれは、この指示に従って一度家を引っ越したら、最初の引っ越しの様子を回復できるのではないかと思った.そこで、B工場は前例のない3回連続の引っ越しを行った.
度熊の「機知」が常に憂慮されることはよく知られているが、不思議なことに、今回は本当に当てはまった.3回目の引っ越しの結果は1回目の結果と全く同じです.
では、このようなことが起こるような指示はいくつあるのでしょうか.2つの指示のうち少なくとも1人の目標位置が異なる場合、この2つの指示は異なると考えられる.
Input
1行目の整数Tは、Tグループデータを表す.
各データセットは、整数N(1≦N≦1000000)を含む.
Output
各グループのデータについて、まず1行Case#i:を出力し、その後、結果を出力し、100000007を型抜きする.
Sample Input
Sample Output
1002列変位法復号
Accepts: 778
Submissions: 2693
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
列変位法は古典的な暗号アルゴリズムにおける変位暗号化の1つの方法であり、具体的な過程は以下のように明文文字を個数固定のグループ(例えば5つのグループ、5は鍵)に分割し、1つのグループの1行の順序で整然と並べ、最後に1つのグループが何の文字も置かず、完成した後に列で読み取ると暗号文になる.
例:
原文:123456789
鍵:4
変換後の行列:
(最後のいくつかのxは任意の文字がなく、スペースではなく、タブではなく、任意の文字がないことを示しています.以下同じです)
密文:159263748
たとえば、
译文:ハロー、welcome to my dream world!
鍵:7
変換後の行列:
密文:
Hw doeetrrlloellc adoomm!,my e w
カラム変位法を利用した暗号化器を実現するのはBobにとって簡単ですが、Bobにとって、対応する復号器をどのように書くかを明らかにするのは難しいようですが、助けてもらえますか?
Input
1行目の整数Tは、Tグループデータを表す.
各グループのデータには2行が含まれています
第1行、1つの文字列s(1≦|s|≦1 e 5)は、列変位法によって暗号化された暗号文を表す
2行目、1つの整数K(1≦K≦|s|)は、原文が列変位法で暗号化されたときの鍵を表す
入力保証文字列には、ASCIIコードが[0 x 20,0 x 7 F)の範囲内の文字のみが含まれています.
Output
各グループのデータについて、まず1行出力します.
Case #i:
そして、復号後に得られる明文を表す文字列s_decryptを含む行を出力する
Sample Input
Sample Output
1003 IP聚合
Accepts: 866
Submissions: 3804
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
最近、B工場は大きな引っ越しを組織し、すべての人が指示通りに指定された席に変えなければならない.指示の内容は、位置iに座っている人が位置jに移ることである.現在B工場にはN人がいて,1対1からNの位置にある.引っ越してからもいちいち対応していて、変わったのは順位だけです.
初めて引っ越した後、度熊は油断して、元の指示通りに引っ越しをするように要求した.そこで、機知に富んだそれは、この指示に従って一度家を引っ越したら、最初の引っ越しの様子を回復できるのではないかと思った.そこで、B工場は前例のない3回連続の引っ越しを行った.
度熊の「機知」が常に憂慮されることはよく知られているが、不思議なことに、今回は本当に当てはまった.3回目の引っ越しの結果は1回目の結果と全く同じです.
では、このようなことが起こるような指示はいくつあるのでしょうか.2つの指示のうち少なくとも1人の目標位置が異なる場合、この2つの指示は異なると考えられる.
Input
1行目の整数Tは、Tグループデータを表す.
各データセットは、整数N(1≦N≦1000000)を含む.
Output
各グループのデータについて、まず1行Case#i:を出力し、その後、結果を出力し、100000007を型抜きする.
Sample Input
2
1
3
Sample Output
Case #1:
1
Case #2:
4
: : 1000000 , 。 。
f[i] n==i ( ), , f[i] ,
。
: , i-1, f[i-1], i , i
, f[i-1] , f[i]=f[i-1]. i , (i-1) ,
, i-2 f[i-2] 。 :
f[i] = f[i-1]+(i-1)*f[i-2].( )
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <algorithm>
#define mod 1000000007
using namespace std;
__int64 f[1000000+10];
void work()
{
f[0]=0;
f[1]=1;
f[2]=2;
f[3]=4;
//f[i] = f[i-1] + (i-1)*f[i-2]
for(int i=4; i<=1000000; i++){
f[i] = (f[i-1]%mod +(i-1)*f[i-2]%mod)%mod ;
}
}
int main()
{
int t; scanf("%d", &t);
int i, j, k;
int n;
work();
int cnt=1;
while(t--)
{
scanf("%d", &n);
printf("Case #%d:
", cnt++ );
printf("%I64d
", f[n]);
}
return 0;
}
1002列変位法復号
Accepts: 778
Submissions: 2693
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
列変位法は古典的な暗号アルゴリズムにおける変位暗号化の1つの方法であり、具体的な過程は以下のように明文文字を個数固定のグループ(例えば5つのグループ、5は鍵)に分割し、1つのグループの1行の順序で整然と並べ、最後に1つのグループが何の文字も置かず、完成した後に列で読み取ると暗号文になる.
例:
原文:123456789
鍵:4
変換後の行列:
1234
5678
9xxx
(最後のいくつかのxは任意の文字がなく、スペースではなく、タブではなく、任意の文字がないことを示しています.以下同じです)
密文:159263748
たとえば、
译文:ハロー、welcome to my dream world!
鍵:7
変換後の行列:
Hello,
welcome
to my
dream w
orld!xx
密文:
Hw doeetrrlloellc adoomm!,my e w
カラム変位法を利用した暗号化器を実現するのはBobにとって簡単ですが、Bobにとって、対応する復号器をどのように書くかを明らかにするのは難しいようですが、助けてもらえますか?
Input
1行目の整数Tは、Tグループデータを表す.
各グループのデータには2行が含まれています
第1行、1つの文字列s(1≦|s|≦1 e 5)は、列変位法によって暗号化された暗号文を表す
2行目、1つの整数K(1≦K≦|s|)は、原文が列変位法で暗号化されたときの鍵を表す
入力保証文字列には、ASCIIコードが[0 x 20,0 x 7 F)の範囲内の文字のみが含まれています.
Output
各グループのデータについて、まず1行出力します.
Case #i:
そして、復号後に得られる明文を表す文字列s_decryptを含む行を出力する
Sample Input
4
159263748
4
Hw doeetrrlloellc adoomm!,my e w
7
Toodming is best
16
sokaisan
1
Sample Output
Case #1:
123456789
Case #2:
Hello, welcome to my dream world!
Case #3:
Toodming is best
Case #4:
sokaisan
: , vector 。 ,
。
:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <set>
#include <algorithm>
#define N 100000+10
using namespace std;
int main()
{
int t;
int i, j, k;
scanf("%d", &t);
char s[N];
int n;
vector<char>q[N];
int cnt=1;
while(t--)
{
scanf("%*c");
gets(s);
//puts(s);
int len=strlen(s);
//printf("len=%d
", len);
scanf("%d", &n); //
int hang=len/n;
if(len%n > 0)
hang++; // +1
//
int kong=n-(len%n);
int dd=n-kong; //
for(i=0; i<=hang; i++)
q[i].clear();
int e=0;
if(dd==0){
for(i=0; i<len; i++)
{
q[e].push_back(s[i]);
e++;
if(e==hang) e=0;
}
}
else {
for(i=0; i<len; i++){
q[e].push_back(s[i]);
e++;
if(e == hang ) //
{
e=0;
dd--;
if(dd==0)
hang--;
}
}
}
printf("Case #%d:
", cnt++);
for(i=0; i<hang; i++)
{
for(j=0; j<q[i].size(); j++)
printf("%c", q[i][j]);
}
if(len%n > 0)
for(i=0; i<q[hang].size(); i++)
printf("%c", q[hang][i]);
printf("
");
}
return 0;
}
1003 IP聚合
Accepts: 811
Submissions: 1850
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)