20130827组队赛Regionals 2012, North America - Greater NY

来源:互联网 发布:2178手游充值库存软件 编辑:程序博客网 时间:2024/05/16 17:16

今天的题目我以前竟然看过,这.....

 

A.  Hailstone HOTPO

 

水题啊,都做过了,还是没有抢到FB啊,太水了,手速手速;就按照题目给的变换一直变化,一直更新最大值,当找到

1的时候输出最大值就可以了:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int MAX;int t;int index, num;int main(){    scanf("%d", &t);    while(t--)    {        scanf("%d%d", &index, &num);        printf("%d ", index);        MAX = num;        while(1)        {            if(num == 1)            {                printf("%d\n", MAX);                break;            }            if(num%2 == 0)            {                num /= 2;                if(num > MAX)                    MAX = num;            }            else            {                num = 3*num +1;                if(num > MAX)                    MAX = num;            }        }    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


 

B.  B-Casting

 

题目的意思是给出一个A进制的数字B,对于A减一取余,求最后的值是多少(十进制)?

这样我们就对于输入的A进制的数字B,因为B的长度会达到10,000,000.的长度,所以我们不能按照一般的方法,把A进制

的数字B转成十进制再对A-1取模;对于一个A进制的数,假设每一位分别是an....a2,a1,a0;则变成十进制就是

(1*a0)+(A*a1)+......((A^n)*an);对于其中的一项 求(A^k *ak )%(A-1)用t = A-1则变成((t+1)^k*ak)%t而(t+1)

^k%t展开(比如(4*4*4*4)%3 == (4%3)*(4%3) * (4%3) * (4%3) == 1)后只剩1了,其他都是t的倍数所以(b^k

*ak )%(b-1)=ak%(b-1);所以就对于数字B的每一位对A-1取模就可以了:

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);char s[10000005];int main(){    int i, j;    int n, x, t;    __int64 sum;    scanf("%d", &n);    while(n--)    {        scanf("%d%d%s",&t, &x, s);        j = strlen(s);        for(i = 0, sum = 0; i < j; ++i)            sum = (sum * x + s[i]-'0')%(x-1);        printf("%d %I64d\n", t, sum);    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}

 

C.  Pen Counts

 

这道题目的意思就是给出你一个三角形的周长n,然后问你这样的三角形个数有多少个,如果三边不相等则再加一

假设三角形边长为x,y,z,已知z,则有x+y=n-z,x-y<z,令x-y=t,(0<=t<z),求解得 x=(n-z+t)/2,y=

(n-z-t)/2,对于y,ymax=(n-z)/2,ymin=(n-z-(z-1))/2.

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;long long gcd(long long  n,long long  m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}long long  lcm(long long  n,long long  m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int main(){    int num;    int n;    int t;    int ans;    scanf("%d", &t);    while(t--)    {        scanf("%d%d", &num, &n);        ans = 0;        for(int z = 1; z <= n/3; ++z)        {            int temp = 0;            int x = (n-z)/2;            int j = max(z, n/2-z+1);            if(x+z <= n-z-x || x > n-z-x)                continue;            if(j == z)            {                temp = z;                ans--;            }            if(temp != x && x == n-z-x)                ans--;            ans += (x-j+1)*2;        }        printf("%d %d\n", num, ans);    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


昨天在BNU上交的那个在HDU上TLE了:

 

#include<iostream>#include<cstdio>#include<vector>#include<string>#include<queue>#include<cmath>#include<algorithm>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 10005#define INF 0xfffffff#define mem(a,b) memset(a,b,sizeof(a))#define FOR(i,s,t) for(int i=s;i<=t;i++)#define ull unsigned long long#define ll long longusing namespace std;int main(){    int p,n,num;    scanf("%d",&p);    for(int i=1;i<=p;i++)    {        int ans=0;        scanf("%d%d",&num,&n);        for(int c=n/3;2*c<n;c++)        {            for(int a=1;a<=(n-c)/2;a++)            {                int b=n-a-c;                if(a<=b&&b<=c&&a<=c&&a+b>c)//&&f(a,b,c))                {                    ans++;                    if(a!=b&&b!=c&&a!=c)                    ans++;                }            }        }        printf("%d %d\n",num,ans);    }    return 0;}


 


E.  Faulhaber's Triangle

 

这道题目不是特别难,就是麻烦,由于是400*400的格子,可以直接根据题目给出的公式构建出这个表格,由num[i][j]可以推出num[i+1][j+1],可以先求出第二列到后面的值,然后再用1减掉就是第一个数字了。(昨天是用结构体存储分子和分母的,我用了一个三位数组来保存)唉,RE了三次,一直以为是除0的问题,改了好多,还是不行,最后竟然是数组开小了,这.....

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int t;int no;int x, y;long long num[403][403][2];long long gcd(long long n,long long m){    if(m == 0)        return n;    return gcd(m, n%m);}long long lcm(long long n, long long m){    return (n*m)/gcd(n,m);}void init(){    num[0][1][0] = 1;    num[0][1][1] = 1;    long  long sumlcm, sumgcd;    for(int i = 1; i < 403; ++i)    {        sumlcm = 1;        sumgcd = 1;        for(int j = 2; j <= i+1; ++j)        {            if(num[i-1][j-1][0] == 0)            {                num[i][j][0] = 0;                num[i][j][1] = 1;            }            else            {                num[i][j][0] = num[i-1][j-1][0] * i;                num[i][j][1] = num[i-1][j-1][1] * j;                long long gg = gcd(num[i][j][0], num[i][j][1]);                num[i][j][0] /= gg;                num[i][j][1] /= gg;                sumlcm = lcm(sumlcm, num[i][j][1]);            }        }        long long tmp = sumlcm;        for(int k = 2; k <= i+1; ++k)        {            tmp -= num[i][k][0]*(sumlcm/num[i][k][1]);        }        num[i][1][0] = tmp;        num[i][1][1] = sumlcm;        long long pp = gcd(num[i][1][0], num[i][1][1]);        num[i][1][1] /= pp;        num[i][1][0] /= pp;    }}int main(){    init();    scanf("%d", &t);    while(t--)    {        scanf("%d%d%d", &no, &x, &y);        printf("%d " , no);        if(num[x][y][0] < 0 && num[x][y][1] < 0)        {            num[x][y][0] *= -1;            num[x][y][1] *= -1;        }        else if(num[x][y][0] < 0 && num[x][y][1] > 0)        {            printf("-");            num[x][y][0] *= -1;        }        else if(num[x][y][0] > 0 && num[x][y][1] < 0)        {            printf("-");            num[x][y][1] *= -1;        }        printf("%lld", num[x][y][0]);        if(num[x][y][1] != 1)        {            printf("/%lld\n", num[x][y][1]);        }        else            printf("\n");    }    return 0;}


 

J.  Mystery

 

蛋疼的样例啊,对着代码改了半天,就是手动输入MAC可以,复制就不可以了,纠结了半天,木有问题啊,后来他们

才说是给的样例的后面都加了一个空格,所以一直不对,唉,直接交,CE了 ,跪,不明白了index在哪个函数里面用

到了,好奇葩,%*c还是用的不好啊,改了index猜过,这...这道题目就是给你一个字符串,在给出n个数字,分别输

出每次求和的原字符串中的字符,为避免负数的情况,每次都对当前数字加上字符串长度并对Len取模,这样照着输

出就可以了,给样例跪....

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int gcd(int n,int m){    if(n<m) swap(n,m);    return n%m==0?m:gcd(m,n%m);}int lcm(int n,int m){    if(n<m) swap(n,m);    return n/gcd(n,m)*m;}#define N 10000007int prime[N];struct node{    int x, y;};bool cmp(const node & a, const node & b){    return a.x > b.x;}void getPrime();void bash();void wzf();void SG();int QuickMod(int a, int b, int n);int t, n;int index;int num;int main(){    scanf("%d", &t);    while(t--)    {        //mem(str, 0);        scanf("%d%*c", &index);        char str[1000];        gets(str);        scanf("%d", &n);        int len = strlen(str);        int sum = 0;        printf("%d ", index);        while(n--)        {            scanf("%d", &num);            sum += num;            sum = (sum + len)%len;            printf("%c", str[sum]);        }        puts("");    }    return 0;}int QuickMod(int  a,int b,int n){    int r = 1;    while(b)    {        if(b&1)            r = (r*a)%n;        a = (a*a)%n;        b >>= 1;    }    return r;}void getPrime(){    memset(prime, 0, sizeof(prime));    prime[0] = 1;    prime[1] = 1;    for(int i = 2; i < N; ++i)    {        if(prime[i] == 0)        {            for(int j = i+i; j < N; j+=i)                prime[j] = 1;        }    }}void bash(int n, int m){    if(n%(m+1) != 0)        printf("1\n");    else        printf("0\n");}void wzf(int n, int m){    if(n > m)        swap(n, m);    int k = m-n;    int a = (k * (1.0 + sqrt(5.0))/2.0);    if(a == n)        printf("0\n");    else        printf("1\n");}int numsg[N];void SG(int n){    int sum = 0;    for(int i=0; i < n; i++)    {        scanf("%d",&numsg[i]);        sum ^= numsg[i];    }    if(sum == 0)        printf("No\n");    else    {        printf("Yes\n");        for(int i = 0; i < n; i++)        {            int s = sum ^ numsg[i];            if(s < numsg[i])                printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子        }    }}


 

 下面属于转帖:

 

D:dp递推,神奇...

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int t, cnt, n;double l, r, ans;double dp[1005][1005];int main(){    scanf("%d", &t);    while(t--)    {        scanf("%d%d%lf%lf", &cnt, &n, &l, &r);        dp[0][0]=1;        for(int i = 1; i <= n; i++)        {            dp[i][0] = dp[i-1][0]*(1-r) + dp[i-1][1]*l;            for(int j = 1; j <= n; j++)                dp[i][j] = dp[i-1][j-1]*r + dp[i-1][j+1]*l + dp[i-1][j]*(1-l-r);        }        ans = 0;        for(int i = 1; i <= n; i++)            ans += (double)i*dp[n][i];        printf("%d %.4f\n",cnt,ans);    }    return 0;}


 

F.  The King's Ups and Downs

 

题目大意:给你n个人,身高依次是1~n让你求高低高。。。或者低高低。。这样的方案数。

 

解题思路:高中的时候,好像做过一些此类的题目。需要递推,讲一下大概思路。实际上真的不麻烦。已知前面1~n-1的方案数,然后算第n个。从n-1里面选i个排好序的放在n的前面,选择的方法组合数为C(n-1,i)个,(选好数目后排序方案数为dp[i]/2,因为低高低与高低高的数目是一样的,不过1需要特判只有一种),后面的方案数为dp[n-1-i]/2个,同理。。。然后把三个数相乘即可。具体实现见代码。  当然数据量只有20也可以打表

另一神牛:http://blog.csdn.net/u011262722/article/details/10084215

 

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>#include <functional>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cassert>#include <bitset>#include <stack>#include <ctime>#include <list>#define INF 0x7fffffff#define max3(a,b,c) (max(a,b)>c?max(a,b):c)#define min3(a,b,c) (min(a,b)<c?min(a,b):c)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;__int64 dp[22];__int64 pow(int x){    __int64 sum=1;    for(int i=1; i<=x; i++)        sum*=i;    return sum;}__int64 c(int n,int m)  //算组合数{    return pow(n)/pow(m)/pow(n-m);}int main(){    memset(dp,0,sizeof(dp));    dp[1]=1,dp[2]=2,dp[3]=4;    int i,j;    for(i=4; i<=20; i++)    {        dp[i]+=dp[i-1];  //最高的在两边*c(i,0)        for(j=1; j<i-1; j++) //前面有j个后面有i-1-j个        {            if(j==1||i-1-j==1)                dp[i] += (dp[j]*dp[i-1-j]>>1)*c(i-1,j);            else                dp[i] += (dp[j]>>1)*(dp[i-1-j]>>1)*c(i-1,j);        }    }    int tes, cas, x;    scanf("%d", &tes);    while(tes--)    {        scanf("%d%d", &cas, &x);        printf("%d %I64d\n", cas,dp[x]);    }    return 0;}


 

 

 

原创粉丝点击