申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/
顯示具有 數論 標籤的文章。 顯示所有文章
顯示具有 數論 標籤的文章。 顯示所有文章

2012年2月20日 星期一

NOIP1995 普及組 編碼問題 code

【問題描述】
設有一個數組 A : ARRAY[0..N-1] OF INTEGER ;數組中存儲的元素為 0-N-1 之間的整數,且 A[I] ≠ A[J] ( 當 I ≠ J) 時。
例如: N=6 時,有:( 4 , 3 , 0 , 5 , 1 , 2 )
此時,數組 A 的編碼定義如下:
A[0] 的編碼為 0 :
A[I] 的編碼為:在 A[0] , A[1] ,…… A[I-1] 中比 A[I] 的值小的元素的個數( I=1 , 2 ,…… N-1 )
所以上面數組 A 的編碼為 :B=(0,0,0,3,1,2)
程序要求解決以下問題
① 給出數組 A 後,求出其編碼;
② 給出數組 A 的編碼後,求出 A 的原資料。

2012年2月18日 星期六

[計算幾何]USACO Feb08 USACO Silver Game of Lines 連線遊戲

Title: 連線遊戲
Input: lines.in
Output: lines.out
Time Limit: 1000 ms
Memory Limit: 16 MB
Level: ★☆
Farmer John最近發明瞭一個遊戲,來考驗自命不凡的貝茜。遊戲開始的時候,FJ會給貝茜一塊畫著N (2 <= N <= 200)個不重合的點的木板,其中第i個點的橫、縱座標分別為X_i和Y_i (-1,000 <= X_i <=1,000;-1,000 <= Y_i <= 1,000)。
貝茜可以選兩個點畫一條過它們的直線,當且僅當平面上不存在與畫出直線平行的直線。遊戲結束時貝茜的得分,就是她畫出的直線的總條數。為了在遊戲中勝出,貝茜找到了你,希望你幫她計算一下最大可能得分。
程序名: lines

2012年2月11日 星期六

USACO Contest Feb2012 Bronze Moo 翻譯+題解

翻譯(質量不高,將就看吧):
USACO Contest Feb2012 Bronze
Problem 3. Moo

奶牛們迷上了一個名為“Moo”的新的單詞遊戲。
在玩該遊戲時,奶牛們站成長長的一排,在隊列中的每一頭
奶牛都有責任盡可能快的大聲說出一個特定的字母。

在Moo遊戲中,這個單詞序列嚴格上說是無窮的,它是這樣開始的:
m o o m o o o m o o m o o o o m o o m o o o m o o m o o o o o

這一串最好由遞歸表示:令S(0)為三個字符的序列“moo”
那麼更長的字符串S(k)由三部分組成,第一部分是S(k-1),第二部分是"m o...o"(k+2個'o'),第三部分又是S(k-1)。例如:
S(0)="m o o"
S(1)="m o o m o o o m o o"
S(2)="m o o m o o o m o o m o o o o m o o m o o o m o o"

正如你所看到的,這個過程最終將會產生一個無窮的長字符串,並且
這個長字符串正是被玩Moo遊戲的奶牛一個一個說出。

Bessie這頭奶牛,自我感覺很聰明,他想要預測第N頭奶牛將會說出m還是o。請你幫助他!

POJ2739(Japan2005) 連續素數和 conprime 解題報告

 連續素數和   題目來源:Japan 2005 (POJ2739)


連結:http://poj.org/problem?id=2739


【問題描述】
一些正整數可以表示成一個或多個連續素數和的形式。那麼一個正整數可以表示成多少種連續素數和的形式呢?例如: 53 有 2 種連續素數和的形式分別是 5+7+11+13+17 和 53. 正整數 41 有 3 種連續素數和的形式: 2+3+5+7+11+13,11+13+17 和 41. 整數 3 只有一種連續素數和的形式就是 3 。 20 就不能表示成連續素數的和。
你的任務就是找出整數 N 能表示成的連續素數和的種數。

2012年2月6日 星期一

[數學方法]OI練習題:硬幣遊戲 coins 解題報告

 硬幣遊戲  coins.cpp/c/pas

【問題描述】
Alice 和 Bob 決定要玩一個有趣的硬幣遊戲。遊戲的一開始他們把 n (1<=n<=10^6 ) 個硬幣放成一個圓圈,如下圖所示。一次操作是指拿走一個硬幣或者拿走兩個相鄰的硬幣,而其他的硬幣留在原來的位置不動。每次操作至少要拿走一個硬幣。從 Alice 開始,遊戲雙方輪流進行操作。拿到最後一個硬幣的人獲勝。
注意:當 n>3 時,我們沿順時針方向用 C1 , C2 , ….. Cn 來表示這 n 個硬幣。如果 Alice 拿走了 C2 ,那麼 C1 和 C3 就不相鄰了!(因為它們中間有一個空位置)
假設 Alice 和 Bob 都很聰明,並且兩個人都用最好的策略來比賽。現在請你來寫一個程序判斷誰將會贏得這個比賽?

2012年1月17日 星期二

[數論]OI練習題:最優分解方案 best 解題報告

[問題描述]
經過第一輪的遊戲,不少同學將會獲得聖誕特別禮物,但這時細心的數學課代表發現了一個問題:留下來的人太多而使禮物數量可能不夠,為此,加試了一道數學題:將一個正整數 n 分解成若干個互不相等的正整數的和,使得這些數的乘積最大,當主持人報出一個 n 後,請你立即將這個最大值報出來,現請你幫你的好友編一個程序來解決這個問題。

2011年12月8日 星期四

NOIP2011提高組 Day2 計算係數 factor 解題報告

題目查看、下載

【題目分析】
數論,C(k,m)*a^n*b^m即可。C(k,m)表示組合數,可以使用楊輝三角遞推求出。
考察知識點:
1) 二項式定理
2) 組合數遞推/楊輝三角
3) 同餘定理


【我的代碼】

#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int A,B,K,N,M;
const int MOD=10007;
int YH[1020][1020];
void yanghui()
{
 for (int i=0;i<=K+1;i++)
  for (int j=1;j<=K+2;j++)
   YH[i][j]=0;
 for (int i=0;i<=K+1;i++)
  YH[i][1]=1;
 for (int i=1;i<=K;i++)
 {
  for (int j=2;j<=i+1;j++)
  {
   YH[i][j]=(YH[i-1][j-1]+YH[i-1][j])%MOD;
  }
 }  
 
 /*
 for (int i=0;i<=K;i++)
 {
  for (int j=1;j<=i+1;j++)
   printf("%d ",YH[i][j]);
  printf("\n");
 }
 */
}
 
int Get(int num,int index)
{
 int res=1;
 for (int i=1;i<=index;i++)
  res=(res*num)%MOD;
 return res;
}
 
int main()
{
 freopen("factor.in","r",stdin);
 freopen("factor.out","w",stdout);
 scanf("%d %d %d %d %d\n",&A,&B,&K,&N,&M);
 yanghui();
 int NM=Get(A%MOD,N);
 int MM=Get(B%MOD,M);
 int res=(NM*MM)%MOD;
 res=(res*YH[K][M+1])%MOD;
 //printf("%d %d\n",NM,MM);
 printf("%d\n",res);
 return 0;
}

2011年11月26日 星期六

[搜索]AHOI2009:飛行棋 fly 解題報告

Description
給出圓週上的若干個點,已知點與點之間的弧長,其值均爲正整數,並依圓周順序排列。
請找出這些點中有沒有可以圍成矩形的,並希望在最短時間內找出所有不重複矩形。
Input
第一行爲正整數N,表示點的個數,接下來N行分別爲這N個點所分割的各個圓弧長度
Output
所構成不重複矩形的個數
Sample Input
8 1 2 2 3 1 1 3 3
Sample Output
3
Hint
N<= 20
Source 
HAOI2009-2    2009年安徽NOI省選 第二試 第一題

【分析】 
省選中的水題,直接爆搜即可。
根據平面幾何的知識,構成矩形的充分條件是對邊相等。
由於數據量不大,深度優先搜索、廣度優先搜索均可,連開四層循環暴力枚舉都可以。

【我的代碼】
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int N;
int Q[5];
int S[21]={0};
int C[21];
int ans=0;

void init()
{
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        cin>>C[i];
        S[i]=S[i-1]+C[i];
    }
}

void dfs(int deep,int num)
{
    if(deep==5)
    {
        if((S[N]-Q[2]-Q[3]-Q[4])==Q[3] && Q[2]==Q[4])
            ans++;
        return;
    }
    for (int i=num+1;i<=N;i++)
    {
        Q[deep]=S[i]-S[num];
        dfs(deep+1,i);
    }
}

int main()
{
    freopen("fly.in","r",stdin);
    freopen("fly.out","w",stdout);
    init();
    dfs(1,0);
    cout<<ans<<endl;
    return 0;
}

2011年10月28日 星期五

USACO Nov09 Silver : The Grand Farm-off 盛大的Farmoff 解題報告

【英文原題】
Problem 7: The Grand Farm-off [Haitao Mao, 2009]

Farmer John owns 3*N (1 <= N <= 500,000) cows surprisingly numbered
0..3*N-1, each of which has some associated integer weight W_i (1 <=
W_i <= d). He is entering the Grand Farm-off, a farming competition
where he shows off his cows to the greater agricultural community.

This competition allows him to enter a group of N cows. He has given
each of his cows a utility rating U_i (1 <= U_i <= h), which
represents the usefulness he thinks that a particular cow will have
in the competition, and he wants his selection of cows to have the
maximal sum of utility.

There might be multiple sets of N cows that attain the maximum
utility sum. FJ is afraid the competition may impose a total weight
limit on the cows in the competition, so a secondary priority is
to bring lighter weight competition cows.

Help FJ find a set of N cows with minimum possible total weight
among the sets of N cows that maximize the utility, and print the
remainder when this total weight is divided by M (10,000,000 <= M
<= 1,000,000,000).

Note: to make the input phase faster, FJ has derived polynomials
which will generate the weights and utility values for each cow.
For each cow 0 <= i < 3*N,

       W_i = (a*i^5+b*i^2+c) mod d
 and   U_i = (e*i^5+f*i^3+g) mod h

with reasonable ranges for the coefficients (0 <= a <= 1,000,000,000;
0 <= b <= 1,000,000,000; 0 <= c <= 1,000,000,000; 0 <= e <=
1,000,000,000; 0 <= f <= 1,000,000,000; 0 <= g <= 1,000,000,000;
10,000,000 <= d <= 1,000,000,000; 10,000,000 <= h <= 1,000,000,000).

The formulae do sometimes generate duplicate numbers; your algorithm
should handle this properly.

PROBLEM NAME: farmoff

INPUT FORMAT:

* Line 1: Ten space-separated integers: N, a, b, c, d, e, f, g, h, and
        M

SAMPLE INPUT (file farmoff.in):

2 0 1 5 55555555 0 1 0 55555555 55555555

INPUT DETAILS:

The functions generate weights of 5, 6, 9, 14, 21, and 30 along
with utilities of 0, 1, 8, 27, 64, and 125.

OUTPUT FORMAT:

* Line 1: A single integer representing the lowest sum of the weights
        of the N cows with the highest net utility.

SAMPLE OUTPUT (file farmoff.out):

51

OUTPUT DETAILS:

The two cows with the highest utility are cow 5 and 6, and their combined
weight is 21+30=51.

【中文翻譯】
問題描述:
農夫約翰擁有 3*N(1 <= N <= 500,000)只牛,它們的編號爲0..3*N-1,每隻牛都有一個體重 W_i(1 <= W_i <= d)。約翰參加了一個叫做 Farm-off 的盛大競賽活動,在這個活動上他可以在整個農業界炫耀他的牛。
這個競賽約翰可以派出一隊共 N 頭牛參賽,他的每頭牛都有一個效率值 U_i (1 <= U_i <= h),這個值用來描述他認爲在這個競賽中每頭牛的有用值。約翰想讓他選擇的一羣牛有一個最大的效率總值。
可能有很多種 N 頭牛的集合可以達到這個最大的效率總值。農夫約翰爲了防止競賽中的欺騙行爲,對牛的體重加以限制。所以第二個要考慮的因素便是參加競賽的牛的體重。
幫助約翰從所有以N頭牛組合而得的效率總值最大的集閤中,找到一個最小體重的組合。 並且打印出體重總值被M (10,000,000 <= M <= 1,000,000,000)整除後的餘數。
注意:爲了儘快地輸入,約翰找到一個能夠表示出每頭牛體重及效率值的多項式:
對於每頭牛 0 <= i < 3*N,
W_i = (a*i^5+b*i^2+c) mod d
U_i = (e*i^5+f*i^3+g) mod h 

合理的係數範圍:
0 <= a <= 1,000,000,000;
0 <= b <= 1,000,000,000;
0 <= c <= 1,000,000,000;
0 <= e <= 1,000,000,000;
0 <= f <= 1,000,000,000;
0 <= g <= 1,000,000,000;
10,000,000 <= d <= 1,000,000,000;
10,000,000 <= h <= 1,000,000,000.
公式有時會產生一些重複的數字,你的算法應該能夠適應這種情況。
PROBLEM NAME: farmoff

輸入格式:
第一行:用空格隔開的10個數字:N, a, b, c, d, e, f, g, h,M

輸入樣例:(file farmoff.in):
2 0 1 5 55555555 0 1 0 55555555 55555555
根據公式計算出來的 W_i 分別是:5, 6, 9, 14, 21,30;計算出來的U_i分別是:0, 1, 8, 27, 64,125

輸出格式:
第一行:一個單獨的整數用來描述:N頭牛的淨效率總值最大的條件下的最小體重總值。

輸出樣例(farmoff.out):
51
兩隻牛的組閤中效率最大的是牛5和牛6,它們的體重總值爲:21+30=51

【分析】
本題並不是很難,因為沒有用到很難的算法。
因為數據很大,當然可以用高精度算法來實現。
但是高精度算法不僅代碼複雜度高,而且時間複雜度也不低。
所以,我們可以通過餘數定理來實現把大數據變小,變到long long的範圍(2^63-1)之內。
 =======================================
[餘數定理]

a:兩數的和除以m的餘數等於這兩個數分別除以m的餘數和。
實例:7÷3=…1,5÷3=…2,這樣(7+5)÷3的餘數就等於1+2=3,所以餘0。
b: 兩數的差除以m的餘數等於這兩個數分別除以m的餘數差。
實例:8÷3=…2,4÷3=…1,這樣(8-4)÷3的餘數就等於2-1=1,所以餘1。
如果是(7-5)÷3呢? 會出什麼問題?
c: 兩數的積除以m的餘數等於這兩個數分別除以m的餘數積。
實例:7÷3=…1,5÷3=…2,這樣(7×5)÷3的餘數就等於1×2=2,所以餘2。
attention:
對a,餘數和應再對m取次餘
對b,餘數差應加上m後再對m取次餘
 ========================================
然後 ,本題剩下的部分就是利用編程語言中的快速排序(qsort),對結構體進行二級排序即可。

【我的代碼】
(在記憶體為512MB,CPU為1.6GHz的評測機上,10組測試數據共運行4.813秒。)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int N;
long long a,b,c,D,e,f,g,H;
long long M;
long long S=0;
long long tt;

class COW
{
public:
    long long W;
    long long U;
}C[1500001];

int cmp(const void *a,const void *b)
{
    class COW *c=(class COW *)a;
    class COW *d=(class COW *)b;
    if(c->U!=d->U)
        return d->U-c->U;
    return c->W-d->W;
}

long long pl(long long num,long long level,long long moder)
{
    long long temp=1;
    while (level)
    {
        temp=(temp*num)%moder;
        level--;
    }
    return(temp);
}

void init()
{
    cin>>N;
    cin>>a>>b>>c>>D>>e>>f>>g>>H;
    cin>>M;
    long long w,u;
    for (int i=0;i<3*N;i++)
    {
        w=((((a%D)*pl(i,5,D))%D+((b%D)*pl(i,2,D))%D)+c%D)%D;
        u=((((e%H)*pl(i,5,H))%H+((f%H)*pl(i,3,H))%H)+g%H)%H;
        C[i].W=w;
        C[i].U=u;
    }

    qsort(C,3*N,sizeof(C[0]),cmp);
  
    for (int i=0;i<N;i++)
    {
        S+=C[i].W;
        S%=M;
    }
    cout<<S<<endl;
}

int main()
{
    freopen("farmoff.in","r",stdin);
    freopen("farmoff.out","w",stdout);
    init();
    return 0;
}