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共一行,有一個整數,表示符合題意的方法數
輸入輸出樣例
3 3
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個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。
輸入輸出樣例
8 2 4 2 4 5 100 2 100
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 號小夥伴所在的位置編號。
輸入輸出樣例
10 3 4 5
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; }