NOIP水題合集[3/未完待續]

Candy?發表於2016-08-22

NOIP2008pj傳球遊戲

題目描述

上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。

遊戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手裡拿著一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同學就是敗者,要給大家表演一個節目。

聰明的小蠻提出一個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裡開始傳的球,傳了m次以後,又回到小蠻手裡。兩種傳球方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有三個同學1號、2號、3號,並假設小蠻為1號,球傳了3次回到小蠻手裡的方式有1->2->3->1和1->3->2->1,共2種。

輸入輸出格式

輸入格式:

輸入檔案ball.in共一行,有兩個用空格隔開的整數n,m(3<=n<=30,1<=m<=30)。

輸出格式:

輸出檔案ball.out共一行,有一個整數,表示符合題意的方法數 

輸入輸出樣例

輸入樣例#1:
3 3
輸出樣例#1:
2

說明

40%的資料滿足:3<=n<=30,1<=m<=20

100%的資料滿足:3<=n<=30,1<=m<=30

2008普及組第三題

-----------------------------------------
環狀遞推,f[i][j]表示第i次到第j個人手裡,人從0開始編號
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=35;
int n,m,f[N][N];
int dp(int i,int j){//printf("%d %d\n",i,j);
    int &ans=f[i][j];
    if(ans!=-1) return ans;
    ans=dp(i-1,(j-1+n)%n)+dp(i-1,(j+1)%n);
    //printf("ans %d\n",ans);
    return ans;
}
int main(){
    cin>>n>>m;
    memset(f,-1,sizeof(f));
    f[0][0]=1;
    for(int j=1;j<n;j++) f[0][j]=0;
    cout<<dp(m,0);
}

 


NOIP2007統計數字

題目描述

某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*10^9)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。

輸入輸出格式

輸入格式:

 

輸入檔案count.in包含n+1行;

第一行是整數n,表示自然數的個數;

第2~n+1每行一個自然數。

 

輸出格式:

 

輸出檔案count.out包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。

 

輸入輸出樣例

輸入樣例#1:
8
2
4
2
4
5
100
2
100

輸出樣例#1:
2 3
4 2
5 1
100 2

說明

40%的資料滿足:1<=n<=1000

80%的資料滿足:1<=n<=50000

100%的資料滿足:1<=n<=200000,每個數均不超過1500 000 000(1.5*109)

NOIP 2007 提高第一題

----------------------------------------------------------------------

map輕鬆水果

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,a;
map<int,int> mp;
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        a=read();
        mp[a]++;
    }
    map<int,int>::iterator it;
    for(it=mp.begin();it!=mp.end();it++){
        printf("%d %d\n",it->first,it->second);
    }
}

 


NOIP2013轉圈遊戲

題目描述

n 個小夥伴(編號從 0 到 n-1)圍坐一圈玩遊戲。按照順時針方向給 n 個位置編號,從0 到 n-1。最初,第 0 號小夥伴在第 0 號位置,第 1 號小夥伴在第 1 號位置,……,依此類推。遊戲規則如下:每一輪第 0 號位置上的小夥伴順時針走到第 m 號位置,第 1 號位置小夥伴走到第 m+1 號位置,……,依此類推,第n − m號位置上的小夥伴走到第 0 號位置,第n-m+1 號位置上的小夥伴走到第 1 號位置,……,第 n-1 號位置上的小夥伴順時針走到第m-1 號位置。

現在,一共進行了 10^k輪,請問 x 號小夥伴最後走到了第幾號位置。

輸入輸出格式

輸入格式:

 

輸入檔名為 circle.in。

輸入共 1 行,包含 4 個整數 n、m、k、x,每兩個整數之間用一個空格隔開。

 

輸出格式:

 

輸出檔名為 circle.out。

輸出共 1 行,包含 1 個整數,表示 10

k 輪後 x 號小夥伴所在的位置編號。

 

輸入輸出樣例

輸入樣例#1:
10 3 4 5
輸出樣例#1:
5

說明

對於 30%的資料,0 < k < 7;

對於 80%的資料,0 < k < 10^7;

對於 100%的資料,1 <n < 1,000,000,0 < m < n,1 ≤ x ≤ n,0 < k < 10^9

 


 

裸取模快速冪 

 

//
//  main.cpp
//  noip2013d2t1
//
//  Created by abc on 16/8/2.
//  Copyright © 2016年 abc. All rights reserved.
//

#include <iostream>
typedef long long ll;
using namespace std;
ll n,m,k,x;

ll powMod(ll a,ll b){
    ll ans=1;
    for(;b;b>>=1,a=(a*a)%n)
        if(b&1) ans=(ans*a)%n;
    return ans;
}

int main(int argc, const char * argv[]) {
    cin>>n>>m>>k>>x;
    cout<<(powMod(10,k)*m%n+x)%n;

    return 0;
}

 



相關文章