??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合鬼色88久久精品综合自在自线噜噜 ,久久天天日天天操综合伊人av,久久国产免费观看精品3http://www.shnenglu.com/csu-yx-2013/archive/2012/08/06/186469.htmlyxyxMon, 06 Aug 2012 08:01:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/08/06/186469.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/186469.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/08/06/186469.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/186469.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/186469.html
   l你一个素数P(P<=30000)和一串长为n的字W串str[]。字?*'代表0Q字母a-z分别代表1-26Q这n个字W所代表的数字分别代?br />f(1)、f(2)....f(n)。定? f (k) = ∑0<=i<=n-1aiki (mod p) (1<=k<=n,0<=ai<P)Q求a0、a1.....an-1。题目保证肯定有唯一解?br />   解题思\Q高斯消元。根据上面的公式昄可以列出有n个未知数的n个方E式Q?/div>
   a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)
   a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)
   ..............
   a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)
   然后采用高斯消元法来解上面的方程l即可?br />   典型的高斯消元题Q只是多了个modPQ因此计过E中可能需要扩展欧几里L法?br />
   说下所谓的高斯消元的思\Q其实可以参看维基百U,
http://zh.wikipedia.org/wiki/%E9%AB%98%E6%96%AF%E6%B6%88%E5%8E%BB%E6%B3%95Q大致过E是一直消变量?br />比如刚开始,消第一个变量,消完之后只让W一个方E含有第一个变量,然后消第二个变量Q消完之后只让第二个方程含第二个变量Q以?br />下去让最后的方程含最后一个变量,而且最后一个方E中对于前N-1个变量的pL都是0Q这样就能解N个变量了?br />   关于自由元指的是q个变量可以取Q何|得出q样的结论是在消变量的过E中发现该变量的在第row个方E到WN方程中的pL都是0了,
所以可以取M倹{判断无解的方式是,Wrow+1到第N个方E在高斯消元之后所有的pL必定?Q所以方E的g必须??br />   求方E的解得q程是从N个解开始逆推Q第N-1个方E也包?个变量了Q第N个变量和WN-1个变量,以此下去Q就可以解出方程l了?br />   具体的可以参照维基百U和代码仔细分析。还有演法W记上也有高斯消元的解释?br />
   代码如下Q?br />
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX (70 + 10)

int nMatrix[MAX][MAX];
int nAns[MAX];
void InitMatrix(char* szStr, int nN, int nP)
{
    memset(nMatrix, 0, sizeof(nMatrix));
    for (int i = 0; i < nN; ++i)
    {
        nMatrix[i][nN] = (szStr[i] == '*' ? 0 : szStr[i] - 'a' + 1);
    }
    for (int i = 0; i < nN; ++i)
    {
        int nTemp = 1;
        for (int j = 0; j < nN; ++j)
        {
            nMatrix[i][j] = nTemp;
            nTemp = (nTemp * (i + 1)) % nP;
        }
    }
}

int egcd(int nA, int nB, int& nX, int& nY)
{
    if (nA < nB)swap(nA, nB);
    if (nB == 0)
    {
        nX = 1, nY = 0;
        return nA;
    }
    int nRet = egcd(nB, nA % nB, nX, nY);
    int nT = nX;
    nX = nY;
    nY = nT - (nA / nB) * nY;
    return nRet;
}

int Gauss(int nN, int nP)
{
    int nR, nC;
    for (nR = nC = 0; nR < nN && nC < nN; ++nR, ++nC)
    {
        if (nMatrix[nR][nC] == 0)
        {
            for (int i = nR + 1; i < nN; ++i)
            {
                if (nMatrix[i][nC])
                {
                    for (int j = nC; j <= nN; ++j)
                    {
                        swap(nMatrix[nR][j], nMatrix[i][j]);
                    }
                    break;
                }
            }
        }

        if (nMatrix[nR][nC] == 0)
        {
            nR--;    //自由?/span>
            continue;
        }
        int nA = nMatrix[nR][nC];
        for (int i = nR + 1; i < nN; ++i)
        {
            if (nMatrix[i][nC])
            {
                int nB = nMatrix[i][nC];
                for (int j = nC; j <= nN; ++j)
                {
                    nMatrix[i][j] = (nMatrix[i][j] * nA - nMatrix[nR][j] * nB) % nP;
                }
            }
        }
    }
    for (int i = nR; i < nN; ++i)
    {
        if (nMatrix[i][nN])
        {
            return -1;//无解
        }
    }
    
    int nX, nY;
    for (int i = nN - 1; i >= 0; i--)
    {
        int nSum = 0;
        for (int j = i + 1; j < nN; ++j)
        {
            nSum = (nSum + nMatrix[i][j] * nAns[j]) % nP;
        }
        
        nSum = (nMatrix[i][nN] - nSum + nP * nP) % nP;
        
        egcd(nP, (nMatrix[i][i] + nP) % nP, nX, nY);
        nY = (nY + nP) % nP;
        nAns[i] = (nY * nSum + nP) % nP;//Wi个解
    }
    return 1 << (nN - nR);//q回解的个数,本题有唯一?/span>
}

int main()
{
    int nT;

    scanf("%d", &nT);
    while (nT--)
    {
        int nP;
        int nN;
        char szStr[MAX];
        scanf("%d%s", &nP, szStr);
        nN = strlen(szStr);
        InitMatrix(szStr, nN, nP);
        Gauss(nN, nP);
        for (int i = 0; i < nN; ++i)
        {
            printf("%d%s", nAns[i], i == nN - 1 ? "\n" : " ");
        }
    }

    return 0;
}
   


yx 2012-08-06 16:01 发表评论
]]>uva 10392 - Factoring Large Numbershttp://www.shnenglu.com/csu-yx-2013/archive/2012/08/01/185896.htmlyxyxWed, 01 Aug 2012 07:51:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/08/01/185896.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/185896.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/08/01/185896.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/185896.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/185896.html子的大小过1000000。哈哈,q就是暴点啊。既Ӟ如此直接枚D1000000以内的因子就行了Q剩余的部分如果大于10??br />肯定是N的因子了Q就不用暴力了。如果小?0?ơ肯定是1啦,因ؓ2-1000000的因子都被处理了啊?br />   q样q个题就不会时了。确实,暴力是需要技巧的。还要注意uva上要?lld输入?br />
#include <stdio.h>
#include <math.h>
typedef long long LL;
#define MAX (6000000)
bool bPrime[MAX];
int nPrime[MAX];
int nNum;

void InitPrime()
{
    LL nMax = sqrt(MAX) + 1;
    bPrime[0] = bPrime[1] = true;
    for (int i = 2; i <= nMax; ++i)
    {
        if (!bPrime[i])
        {
            for (int j = 2 * i; j < MAX; j += i)
            {
                bPrime[j] = true;
            }
        }
    }
    for (int i = 2; i < MAX; ++i)
    {
        if (!bPrime[i])
            nPrime[nNum++] = i;
    }

}

bool IsPrime(LL nN)
{
    if (nN < MAX) return !bPrime[nN];
    LL nMax = sqrt((double)nN) + 1;
    for (LL j = 0, i = nPrime[j]; i <= nMax; ++j, i = nPrime[j])
    {
        if (nN % i == 0)
        {
            return false;
        }
    }
    return true;
}

int main()
{
    LL nN;

    InitPrime();
    while (scanf("%lld", &nN), nN >= 0)
    {
        if (nN <= 2)
        {
            printf("%-lld\n\n", nN);
            continue;
        }

        int nMax = sqrt((double)nN)+ 1;
        for (LL i = 2; i <= 1000000 && i <= nMax; ++i)
        {
            while (nN % i == 0)
            {
                printf("    %-lld\n", i);
                nN /= i;
            }
            if (nN < 6000000 && IsPrime(nN))
            {
                break;
            }
        }
        if (nN != 1)
            printf("    %-lld\n", nN);
        printf("\n");
    }

    return 0;
}


yx 2012-08-01 15:51 发表评论
]]>
poj 1401 Factorialhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/27/185327.htmlyxyxFri, 27 Jul 2012 07:05:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/27/185327.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/185327.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/27/185327.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/185327.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/185327.html但是Q我q是试了下,果断时了?br />   那就只有x学结ZQ果断想?-N中能?整除的数字有N / 2。哈哈,再往后思考下Q发?-N中能?整除的数字有N / 4个,再往?br />是N / 8Q一直到N 除以2的某个次方ؓ0为止Q那么把所有的值加h是2的因子的个数了。求5的因子的个数也是q样的方法了?br />   很明显,5的因子的个数一定会于{于2的因子的个数。那么直接求5的因子的个数p了。由于,N / 5的时候用C向下取整Q?br />所以不能用{比数列求和公式Q怎么把答案弄成一个公式,q不知道了?br />   PSQ其实我q种思\的灵感来自于{选素数的Ҏ了?br />
代码如下Q?br />
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;

int GetAns(int nN)
{
    int nAns = 0;
    while (nN)
    {
        nAns += nN / 5;
        nN /= 5;
    }
    return nAns;
}

int main()
{
    int nT;

    scanf("%d", &nT);
    while (nT--)
    {
        int nN;
        scanf("%d", &nN);
        printf("%d\n", GetAns(nN));
    }
    
    return 0;
}


yx 2012-07-27 15:05 发表评论
]]>
poj 1730 Perfect Pth Powershttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/26/185236.htmlyxyxThu, 26 Jul 2012 12:59:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/26/185236.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/185236.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/07/26/185236.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/185236.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/185236.html题意?a的pơ方 = nQ其中n?2位整敎ͼa和p都是整数Q求满条g的最大p。好吧,虽然我是在学数论Q但是看到这题,我还是想起了
取对数。那么可以得刎ͼp = ln(n) / ln(a)。既然要求最大的pQ那么a最即可了。那么直接从2开始枚举a不就可以了么?br />    可是直接枚Da的话肯定会超时的Q因为a的范围太大了Q比如n的是个大素数Qa的范围就?-n了,一定超时了。然后,我又惛_另外一
U方法,对n分解因子Qp是所有因子的指数的最大公U数。呵呵,W二U方法更加会无情的超Ӟ׃int范围很大Q实现搞个素数表也不
可能。还是感觉时间不多了Q就不多想了Q然后搜了下Q发C句话Q意识是枚Dp。顿时觉得开朗v来,因ؓp最多是32。由前面可以得到
ln(a) = ln(n) / p。那么只要从32?枚DpQ保证a是整数即可?br />   后面发现q样_ֺ难于控制Q各U原因反正过不了题,看网上的代码Q改成计指数的形式了。因?a = n?1/p)ơ,q个可以用pow?br />数算出来Q如果a是整敎ͼ那么再计pow(a,p)׃是n了。最难控制的是精度了Q还有说n是负数的情况。不知道Z么直接处理负数答?br />一直不对,只好把负数变为正敎ͼ同时判断p不能是偶数?br />
代码如下Q?br />
#include <stdio.h>
#include <math.h>

int main()
{
    double fN;//用double׃会溢Z,负数可以直接{换ؓ正数?/span>
    
    while (scanf("%lf", &fN), fN)
    {
        bool bFlag = false;
        double fP = 31.0;
        if (fN < 0){fP = 32.0; fN = -fN; bFlag = true;};
        
        while (fP > 0)
        {
            //必须加上一个精?防止往下误?/span>
            double fA = pow(fN, 1.0 / fP) + 1e-8;
            //fA必须转换为int,因ؓ一点点误差,pow之后׃攑֤很多
            double fTemp = pow((int)fA, fP);
            
            //必须对负数特D判?不可能出现偶数的p
            if (fabs(fN - fTemp) < 1e-8 && (!bFlag || ((int)fP) % 2))
            {
                printf("%.f\n", fP);
                break;
            }
            fP -= 1.0;
        }
    }
    
    return 0;
}


yx 2012-07-26 20:59 发表评论
]]>
uva 550 - Multiplying by Rotationhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/08/173995.htmlyxyxTue, 08 May 2012 08:24:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/08/173995.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173995.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/08/173995.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173995.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173995.html   题意是给Z个进Ӟ一个数字的最低位Q和另外的一个数字,比如10q制Q第一个数字的最低位?Q第二个数字?Q?br />Ҏq些信息Q和规则QXXXXX7 * 4 = 7XXXXXQ例?span style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; ">: 179487 * 4 = 717948 Q求出第一个数字的最长度。这?br />规则的意思是乘积是把W一个数字的最低位Ud到最高位上去p了?br />   貌似很难的样子,其实用笔在纸上求一下XXXXX7 * 4 = 7XXXXX׃发现。XXXXX7的每一位都是能够确定的Q当?br />序是从最低位到最高位开始。因为知道最低位Q所以次低位一定是最低位*W二个数%base。以此类推,递归下去卛_?br />最l条件是Q没有进位了Q而且乘积+原来的进?=最低位?br />   我用的递归完全可以Ҏ循环的Ş式,q样速度应该会快些?br />   
   代码如下Q?br />
#include <stdio.h>

int nBase;
int nTwo;
int nOneLow;

int GetMin(int nLow, int nCarry, int nNum)
{
    //printf("nLow:%d, nCarry:%d, nNum:%d\n", nLow, nCarry, nNum);
    int nTemp = nCarry + nLow * nTwo;
    if (nTemp == nOneLow)
    {
        return nNum;
    }

    return GetMin(nTemp % nBase, nTemp / nBase, nNum + 1);
}

int main()
{
    //freopen("out.txt", "w", stdout);
    while (scanf("%d%d%d", &nBase, &nOneLow, &nTwo) == 3)
    {
        printf("%d\n", GetMin(nOneLow, 0, 0) + 1);
    }

    return 0;
}


yx 2012-05-08 16:24 发表评论
]]>
uva 107 - The Cat in the Hathttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173913.htmlyxyxMon, 07 May 2012 08:54:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173913.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173913.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173913.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173913.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173913.html数据量比较小?br />   但是Q这个题q是有数学的解法的。但是,即扑ֈ了这个正的解法Q过题的话,也是一件很困难的事情。题意大致如下:一只猫Q?br />高度为HQ戴了一个帽子,帽子里面有N只猫QN是常敎ͼ且未知)Q同样帽子里面的猫也戴了帽子Q但是这些猫的高度变成了H / (N + 1)Q?br />会向下取整。以此递归下去Q直到最后的猫的高度都ؓ1为止。现在,l出H和高度ؓ1的猫的数量。要求的是高度大?的猫的数量,
以及所有猫的高度之和?br />   很别扭吧。通过上面的信息,得出2个式子。假设one代表为高度ؓ1的猫的数量。one = N的nơ。H >= (N + 1)的nơ。注意第
二个式子不一定取{号Q因为很多时候都是不能整除的。现在要求N和n?个方E解2个未知数Q应该能解出来。但是,注意的是其中
一个还是不{式。。?br />   指数关系很多时候会转换为对数的关系。所以,l箋求对敎ͼ有lgH >= n * lg(N + 1)。其中,q一个式子可以得到n = lg(one)
/ lg(N)。那么最l{换ؓQlgH >= (lg(one) / lgN) * lg(N + 1)。换个Ş式就是lgH / lg(One) >= lg(N + 1) / lgN。现在,已经?br />清晰了。因为,函数lg(N + 1) / lg(N) ?strong>单调递减的。看到单调的函数Q马上就会知道可以二分了。意思是Q我们可以二分出一个N?br /> lg(N + 1) / lgN 最接近lgH / lg(One)Q而且是小于lgH / lg(One)的。剩下的工作只是求和而已了?br />   写二分的时候,有一个地方可以注意一下。因?nbsp;lg(N + 1) / lgN 可能会出现除Cؓ0的情况,所以可以进一步{换ؓlgH * lgN >=
lg(N + 1) * lg(one)
?nbsp;也是求一个N让上面那个不{式2边的值最接近Q而且双于左边?br />   能很快写对这个题真不是gҎ的事情。。?br />
   代码如下Q?br />
#include <stdio.h>
#include <math.h>

int main()
{
    int nInitH, nOnes;
    int nN, n;

    while (scanf("%d%d", &nInitH, &nOnes), nInitH + nOnes)
    {
        int nBeg = 1;
        int nEnd = nOnes;
        int nMid;
    
        while (nBeg <= nEnd)
        {
            nMid = (nBeg + nEnd) / 2;
            
            double fRes = log10(nInitH) * log10(nMid);
            double fTemp = log10(nMid + 1) * log10(nOnes);
            if (fabs(fRes - fTemp) < 1e-10)
            {
                //printf("Find nN:%d\n", nMid);
                nN = nMid;
                break;
            }
            else if (fTemp > fRes)
            {
                nBeg = nMid + 1;
            }
            else
            {
                nEnd = nMid - 1;
            }
        }
        
        n = floor(log10(nInitH) / log10(nN + 1) + 1e-9);
        //printf("nN:%d, n:%d\n", nN, n);

        int nSum = 0;
        int nLazy = 0;
        int nNum = 1;
        for (int i = 0; i <= n; ++i)
        {
            nSum += nNum * nInitH;
            nLazy += nNum;
            nNum *= nN;
            nInitH /= (nN + 1);
        }
        
        printf("%d %d\n", nLazy - nOnes, nSum);
    }

    return 0;
}

   

yx 2012-05-07 16:54 发表评论
]]>
uva 10112 - Myacm Triangleshttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173895.htmlyxyxMon, 07 May 2012 06:07:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173895.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173895.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/07/173895.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173895.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173895.html的点在这个三角Ş的内部和边界上。求三角形的面积Q题目上面已l给了公式,也可以用0.5*|a|*|b|*sin(a,b)求,q里的a和b指的??br />边代表的向量?br />   现在剩下一个问题了Q怎么判断一个点在三角Ş的内部和边界上。在边界上,比较好判断,判断是否qQ然后再Ҏ在线D늚内部?br />具体说明下,判断一个点在三角Ş内部的思\。我用的q是U性规划的思想?strong>如果该点在三角Ş的内部,那么d三角形的一条边Q?br />该内部点和剩余的三角形的一个顶点必定在三角形的那条的边的同一侧?/strong>q个Ҏ也可以推q到N边的凸多边ŞQ证明的话很单,
因ؓU性规划一直在划分区域。所以,划分到最后围h的区域就是凸多边形的内部了?br />   至于写代码的话,׃是第一ơ写q种几何题,写得很凌乱?br />
   代码如下Q?br />
#include <stdio.h>
#include <math.h>

#define MAX (20)
int nN;
struct Point
{
    char szLabel[5];
    int x;
    int y;
};
Point points[MAX];

//三点是否q
bool IsOneLine(int nOne, int nTwo, int nThree)
{
    int nA = points[nTwo].x - points[nOne].x;
    int nB = points[nTwo].y - points[nOne].y;
    int nC = points[nThree].x - points[nOne].x;
    int nD = points[nThree].y - points[nOne].y;
    
    return (nA * nD == nB * nC);
}

//点nOne和点nTwo是否在直U?nBeg,nEnd)的同一?不能在直U上)
bool IsSameSide(int nBeg, int nEnd, int nOne, int nTwo)
{
    //求直U的向量
    int nA = points[nBeg].x - points[nEnd].x;
    int nB = points[nBeg].y - points[nEnd].y;
    
    //直线方程为nB(x - points[nBeg].x) - nA(y - points[nBeg].y) = 0
    
//分别用nOne和nTwo的坐标代入直U方E计结果,然后结果相?br />    //乘积必须大于0
    int nRes = (nB * (points[nOne].x - points[nBeg].x) - nA * (points[nOne].y - points[nBeg].y))
    * (nB * (points[nTwo].x - points[nBeg].x) - nA * (points[nTwo].y - points[nBeg].y));
    
    if (nRes > 0)
    {
        //printf("?%d,?%d,在直UnBeg:%d, nEnd:%d的同一侧\n", nOne, nTwo, nBeg, nEnd);
    }
    return nRes > 0;
}

//Ҏ否在三角?nOne, nTwo, nThree)外部
bool PointOutTriangle(int nOne, int nTwo, int nThree, int nPoint)
{
    //前面3个ifelse是判断点是否在边?/span>
    if (IsOneLine(nOne, nTwo, nPoint))
    {
        if ((points[nOne].x - points[nPoint].x) * (points[nTwo].x - points[nPoint].x) <= 0)
        {
            return false;
        }
    }
    else if (IsOneLine(nOne, nThree, nPoint))
    {
        if ((points[nOne].x - points[nPoint].x) * (points[nThree].x - points[nPoint].x) <= 0)
        {
            return false;
        }
    }
    else if (IsOneLine(nTwo, nThree, nPoint))
    {
        if ((points[nTwo].x - points[nPoint].x) * (points[nThree].x - points[nPoint].x) <= 0)
        {
            return false;
        }
    }
    
    //下面的IsSameSide如果nPoint在直U的(nOne,nTwo)的外侧也会判断ؓ?br />    //所以需要先在上面判断点是否在边的内?/span>
    return !(IsSameSide(nOne, nTwo, nThree, nPoint)
    && IsSameSide(nOne, nThree, nTwo, nPoint)
    && IsSameSide(nTwo, nThree, nOne, nPoint));
}

bool IsValid(int nOne, int nTwo, int nThree)
{
    if (IsOneLine(nOne, nTwo, nThree))
    {
        //printf("?%d,%d,%dq\n", nOne, nTwo, nThree);
        return false;
    }
    
    for (int i = 0; i < nN; ++i)
    {
        if (i == nOne || i == nTwo || i == nThree)
        {
            continue;
        }

        if (!PointOutTriangle(nOne, nTwo, nThree, i))
        {
            //printf("?%d, 在三角Ş:%d,%d,%d内部\n", i, nOne, nTwo, nThree);
            return false;
        }
    }
    
    return true;
}

//计算三角?nOne, nTwo, nThree)的面U?/span>
double GetArea(int nOne, int nTwo, int nThree)
{
    return 0.5 * fabs((points[nThree].y - points[nOne].y) * (points[nTwo].x - points[nOne].x)
    - (points[nTwo].y - points[nOne].y) * (points[nThree].x - points[nOne].x));
}

int main()
{
    while (scanf("%d", &nN), nN)
    {
        for (int i = 0; i < nN; ++i)
        {
            scanf("%s%d%d", points[i].szLabel, &points[i].x, &points[i].y);
        }
        
        double fMaxArea = 0.0;
        int nI = -1, nJ = -1, nK = -1;
        for (int i = 0; i < nN - 2; ++i)
        {
            for (int j = i + 1; j < nN - 1; ++j)
            {
                for (int k = j + 1; k < nN; ++k)
                {
                    if (IsValid(i, j, k))
                    {
                        //printf("i:%d,j:%d,k:%d valid\n", i, j, k);
                        double fArea = GetArea(i, j, k);
                        //printf("Area:%f\n", fArea);
                        if (fArea > fMaxArea)
                        {
                            nI = i;
                            nJ = j;
                            nK = k;
                            fMaxArea = fArea;
                        }
                    }
                }
            }
        }
        printf("%s%s%s\n", points[nI].szLabel, points[nJ].szLabel, points[nK].szLabel);
    }
    
    return 0;
}


yx 2012-05-07 14:07 发表评论
]]>
uva 10025 - The ? 1 ? 2 ? ... ? n = k problemhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/04/173663.htmlyxyxFri, 04 May 2012 08:53:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/04/173663.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173663.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/04/173663.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173663.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173663.html的?P对于指定的KQ求最的n?br />   For example: to obtain k = 12 , - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7?nbsp;  
   q个题,我的思\大致如下。首先,K可能是正的也是负的,而且昄负的情况Q有相应的正对应情况。那么考虑所有k为正的情c?br />׃k一定小于等于n*(n+1)/2的,所以可以先求出q样的最n。这个可以二分搜索,或者直接用解不{式方程(不过q种Ҏ一直wa??br style="font-size: 12pt; " />   然后剩下的是第二点了,假设a + b = n*(n+1)/2, a - b = k。可以得? n*(n+1)/2 - k = 2 * b?/strong>意思是Q必L? n*(n+1)/2
和k的差为偶数。假如满了Q这Ln是不是一定OK了?Q?   
   {案是肯定的Q这一点就是需要猜想的地方了。因为,仔细观察下,1到n的数字可以组合出L??nbsp;n*(n+1)/4之间的数字,q个数字
xb。至于证明,可以用数学归Ux从n==1开始证明了。。。至此已l很单了?nbsp; 
   ׃求n存在2U不同的ҎQ而且我开始用解一元二ơ不{式的方法求的NQ出C点误差Q一直WA了。后面改成二分才q了。。?br />
   代码如下Q?br />
#include <stdio.h> 
#include <math.h>

int GetN(int nK)
{
    int nBeg = 1;
    int nEnd = sqrt(nK * 2) + 2;
    
    while (nBeg <= nEnd)
    {
        int nMid = (nBeg + nEnd) / 2;
        int nTemp = (nMid * nMid + nMid) / 2;
        if (nTemp >= nK)
        {
            nEnd = nMid - 1;
        }
        else
        {
            nBeg = nMid + 1;
        }
    }
    
    return nEnd + 1;
}

int main()
{
    int nK;
    int nTest;
    
    scanf("%d", &nTest);
    while (nTest--)
    {
        scanf("%d", &nK);
        if (nK < 0)
        {
            nK *= -1;
        }
        //int nN = ceil(sqrt(2 * fabs(1.0 * nK) + 0.25) - 0.5 + 1e-9);
        //上面那种Ҏ存在点误差,wa了三?br />        int nN = GetN(nK);
        
        while (1)
        {
            if (((nN * nN + nN) / 2 - nK) % 2 == 0)
            {
                printf("%d\n", nN);
                break;
            }
            ++nN;
        }
        if (nTest)
        {
            printf("\n");
        }
    }
    
    return 0;
}


yx 2012-05-04 16:53 发表评论
]]>
uva 10014 - Simple calculationshttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/03/173597.htmlyxyxThu, 03 May 2012 10:55:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/03/173597.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173597.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/03/173597.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173597.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173597.html的解释。真的很惭愧很崩溃。。。这是一个数列推理的题目吧?br />   l出一个数列ciQ?<=ci<=n)Q然后给出数列ai中的a0和a(n+1)。ƈl出一个公式ai = ( a(i-1) + a(i+1) )  /  2 - ci。题目的意?br />是让求a1。大家在很久以前的高中时代一定做q很多的数列题,所以我一看到q个题还是感觉很亲切的。然后就开始推。我把上面那
个公式,从i==1到i==nQ全部篏加v来。消?边一L,得到一个结?strong>a1 + an = a0 + a(n+1) - 2 
Σci(1<=i<=n)。从q?br />个公式,我只能得到a1和an 的和。想来想去都无法直接求出a1的倹{但是,我也知道如果能求出a1Q那么ai中的M其它w是能?br />出来的。我猜想a1和an相等Q提交当然wa了。然后,我猜想ai是a0和a(n+1)的i分点Q提交还是wa了。后面这个猜惛_是合理点,但是
q是有不严}的地方,因ؓ那样Qa1的g和a0Qa(n+1)Qc1q三个值有关系了?br />   q个题其实以前我想了一下,没想出来。然后今天重新想的时候可能受以前的媄响,限制了一个思\。那是Q再对式子a1 + an =
a0 + a(n+1) - 2 Σci(1<=i<=n)q行累加。其实,也有a1 + a(n-1) = a0 + an - 2 Σci(1<=i<=n-1)。这L加nơ,刚好可以?br />a2-an全部消去。可以得刎ͼ一个式?strong>(n+1)a1 = n * a0 + a(n+1)- 2  ΣΣ cj(1<=j<=i) (1<=i<=n)。那么就可以直接求出a1了?br />   公式Q?img src="http://www.shnenglu.com/images/cppblog_com/csu-yx/mathtex.gif" width="254" height="42" alt="" />
   
   代码如下Q?br />
#include <stdio.h>
#include <string.h>

int main()
{
    int nCases;
    int nN;
    double a0, an1;
    double a1;
    double ci[3000 + 10];
    double c;
    double sum;
    
    scanf("%d", &nCases);

    while (nCases--)
    {
        scanf("%d", &nN);
        scanf("%lf%lf", &a0, &an1);
        
        sum = 0.0;
        memset(ci, 0, sizeof(ci));
        for (int j = 1; j <= nN; ++j)
        {
            scanf("%lf", &c);
            ci[j] = ci[j - 1] + c;//ci[j]代表数列ci中第1-j的?/span>
            sum += ci[j];
        }

        a1 = (nN * a0 + an1 - 2 * sum) / (nN + 1);
        printf("%.2f", a1);
        putchar('\n');
        
        if (nCases)
        {
            putchar('\n');
        }
    }
    
    return 0;
}


yx 2012-05-03 18:55 发表评论
]]>uva 10061 - How many zero's and how many digits ?http://www.shnenglu.com/csu-yx-2013/archive/2012/05/02/173512.htmlyxyxWed, 02 May 2012 12:05:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/02/173512.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/173512.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/05/02/173512.html#Feedback0http://www.shnenglu.com/csu-yx-2013/comments/commentRss/173512.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/173512.html需要多位敎ͼq个表示末尾会有多少?。这个题q不需要什么高q知识Q这一点也是我喜欢做这c题的一个方法?br />大家昄都知道求nQ用10q制表示末尾会有多少?的方法,是?*5最多有多少寏V那么,bq制了。方法类|发散一下想法而已?br />   我还是先说求多少位数的方法吧?b的m-1?<= nQ?lt;= b的m?/strong>QPSQ这个不{式如果把b换成10大家一定会明白的)Q?br />看到q个不等式应该有x了吧。两边同时取logbQ就可以得到Σlogi(1<=i<=n) <= mQm直接求出来了。mx位数?br />   再说怎么求末?的,发散下想法,我们也可以对nQ中的每个因子试着求b的因子对Q一共有多少寏V但是,后面发现q样不行Q?br />因ؓ比如b?6Q??6是一对因子,2?是一对因子,4?是一对因子,也就是因?也是4的因子,q样计算因子对就会重复了?br />但是对于b{于10的情况,可以例外而已?br />   呵呵Q考虑其它的方法。求素数因子。Q何数字都可以被分解ؓ一些素数因子的乘积Q这是毋容置疑的。那么,我们d解nQ中?br />于{于b的素数因子,q将其个数存储在数组里面。然后死循环的去分解b的素数因子,能够完全分解一?br />(具体看下代码Q不好描qͼQans加1?/strong>否则Q已l没有末?了?br />   虽然提交?6ơ才q。不q最后还不错吧Q只用了0.508s。相?0s的时间界限,很小了。网上有些过的代码,跑一个数据都?br />几分钟。。。PSQuva上那些神人,怎么?.0s出来的Q很难想象啊?br />   q个题目q有个很大的需要注意的地方Q就是QҎ的精度问题。前面讲到求位数需要用到log函数Qlog函数的计精度就出问题了?br />最后需要对和加一?strong>1e-9再floor才能q。特别需要注意这一点,因ؓ开始我的程序过了所有的http://online-judge.uva.es/board/viewtopic.php?f=9&t=7137&start=30上说的数据还是wa了。而且我还发现log10计算_ֺ?/strong>很多Q如果log(q个是自然对?去计,q个|站上的数据都过不了?br />
#include <stdio.h>
#include <string.h>
#include <math.h>

int nN, nB;

int nDivisor[1000];

int GetDigit(int nN, int nB)
{
    double fSum = 0.0;
    for (int i = 2; i <= nN; ++i)
    {
        fSum += log10(i);
    }
    
    fSum /= log10(nB);
   
    return floor(fSum + 1e-9) + 1;
}

int GetZero(int nN, int nB)
{
    memset(nDivisor, 0, sizeof(nDivisor));

    for (int i = 2; i <= nN; ++i)
    {
        int nTemp = i;
        
        for (int j = 2; j <= nTemp && j <= nB; ++j)//q样循环可以进行素数因子分解了
        {
            while (nTemp % j == 0)
            {
                nDivisor[j]++;
                nTemp /= j;
            }
        }
    }
    
    int nAns = 0;
    
    while (1)
    {
        int nTemp = nB;
        
        for (int j = 2; j <= nTemp; ++j)//分解nB
        {
            while (nTemp % j == 0)
            {
                if (nDivisor[j] > 0)//如果q可以l分?br />                {
                    --nDivisor[j];
                }
                else //直接可以goto跛_多重循环?/span>
                {
                    goto out;
                }
                nTemp /= j;
            }
        }
        ++nAns;
    }
    
out:
    return nAns;
}

int main()
{
    while (scanf("%d%d", &nN, &nB) == 2)
    {
        int nDigit = GetDigit(nN, nB);
        int nZero = GetZero(nN, nB);
        printf("%d %d\n", nZero, nDigit);
    }

    return 0;
}


yx 2012-05-02 20:05 发表评论
]]>
uva 10790 - How Many Points of Intersection?http://www.shnenglu.com/csu-yx-2013/archive/2012/04/12/171132.htmlyxyxThu, 12 Apr 2012 12:44:00 GMThttp://www.shnenglu.com/csu-yx-2013/archive/2012/04/12/171132.htmlhttp://www.shnenglu.com/csu-yx-2013/comments/171132.htmlhttp://www.shnenglu.com/csu-yx-2013/archive/2012/04/12/171132.html#Feedback2http://www.shnenglu.com/csu-yx-2013/comments/commentRss/171132.htmlhttp://www.shnenglu.com/csu-yx-2013/services/trackbacks/171132.htmlhttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=99&page=show_problem&problem=1731 

   q是一个数学题Q比较有意思。题意大致是Q有2条^行的直线Q第一条上面有m个点Q第二条上面有n个点。那么连接这写点能生m*n
条直U?不包括和原来的执行^行的直线)。问qm*n直线最多有多少个内交点(意思是不属于原来m,n个点的交?...
   
   x惛_Q推理了1个多时才出来正式结果。感觉比较有意思,写篇博文记录下。我先是从反面排除,想了试了好久到最后还是发现无?br />排除q净。。。最后只能从正面开始求证了。我q样定义一条执?iQj)Q其中i代表在第一条直U中的端点,j代表在第二条直线中的端点?br />昄1 <= i <= mQ而且1 <= j <= n?br />   现在的话只要求出和直U?iQj)相加的直U有多少条,然后对iQjq行累加求和。再对和除以2p得到{案了?br />   那么有多条直线能和直线(iQjQ相交了。很昄Q和(i,j)怺的直U的端点必须在其两侧。意思是在第一条直U中的端点范围ؓ
[1,  i - 1],在第二条直线中的端点范围为[j + 1, n]Qȝ(i - 1) * (n - j) 条直Uѝ但是还有第二种情况,在第一条直U中的端点范?br />为[i + 1, m], 在第二条直线中的端点范围为[1,  j - 1]Qȝ(m - i) * (j - 1) 条直Uѝ?
   总计sum = i * n + i - m -n + j (m - 2 * i + 1) 条直Uѝ?br />   再求ΣsumQj?到n)得到和式(m*n*n - m*n - n*n + n) / 2Q再对这个式子进行i?到m的篏加。因为没有i了,其效果就是乘以m?br />然后最l的和除?Q所以最后的表达式是(m*m*n*n - m*m*n - m*n*n + m*n) / 4。这个式子显然是关于m,n对称的?br />q一点也可以验证q个式子的正性?br />

E序写v来就很简单了Q代码如下:
#include <iostream> 
using namespace std;

int main()
{
    long long m, n;
    int nCases = 0;
    
    while (cin >> m >> n, m + n != 0)
    {
        long long a = m * m;
        long long b = n * n;
        cout << "Case " << ++nCases << ": "
        << (a * b - a * n - b * m + m * n) / 4 << endl;
    }
    
    return 0;
}


yx 2012-04-12 20:44 发表评论
]]>
޹ƷȾþ| ձþþþĻ| 97þþþ޾Ʒר| Ļþ2020 | ˾þ91| þþƷ99Ʒ| һþ֪ۺϾþ| 91þþһȫ| ձƷþ| պ޾Ʒþ| ձþþþƷĻ| þˬ˰| þþƷֻоƷ2020| þǿdŮ| 99þɫĻ| ˼˼þ99ֻƵƷ66| ŷþþƷһcƬƬ| 99þþƷѿһ| þ| 99þþƷѿһ | ŷþۺ㽶| ۺϾþҹAV | Ů㽶þ**ëƬƷ| þĻƷѩ | þ޹ҹƷƬ| һɫۺþ| þþžžþƷ| þþþӰԺ| þþ97ɫ | ƷþþþþþþӰԺ| ھƷþþþþþcoent | þ99ֻоƷ| ƷˮҾþþþþþ| 97þó˾Ʒվ| ɫþþۺ| þˬˬƬAV | AAAþþþƷƬ| þþþþAv뾫Ʒר| ŷƷþþ| þˮav뾫Ʒ鶹 | Ʒһþ|