light oj Basic Math 数论基础

这里是除去Beginners Problems后的部分

1020 - A Childhood Game

巴什博奕(Bash Game)

#include<bits/stdc++.h>
using namespace std;

int main(void)
{
    int t,Case=0;
    int n;
    char s[10];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%s",&n,&s);
        printf("Case %d: ",++Case);
        if(strcmp(s,"Alice")==0)
        {
            if(n%3==1)
                puts("Bob");
            else
                puts("Alice");
        }
        else
        {
            if(n%3==0)
                puts("Alice");
            else
                puts("Bob");
        }
    }
    return 0;
}

1078 - Integer Divisibility

#include<bits/stdc++.h>
using namespace std;

int main(void)
{
    int t,Case=0;
    int n,digit;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&digit);
        int cnt=1;
        int tmp=digit;
        while(tmp%n!=0)
        {
            tmp=(tmp*10+digit)%n;
            cnt++;
        }
        printf("Case %d: %d\n",++Case,cnt);
    }
    return 0;
}

1148 - Mad Counting

#include<bits/stdc++.h>
using namespace std;

map<int,int> ma;
map<int,int>::iterator ite;
int main(void)
{
    int t,Case=0;
    int n,x;
    scanf("%d",&t);
    while(t--)
    {
        ma.clear();
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d",&x);
            ma[x]++;
        }
        int ans=0;
        for(ite=ma.begin(); ite!=ma.end(); ite++)
        {
            ans+=(ite->second+ite->first)/(ite->first+1)*(ite->first+1);
        }
        printf("Case %d: %d\n",++Case,ans);
    }
    return 0;
}

1179 - Josephus Problem

约瑟夫环

#include<bits/stdc++.h>
using namespace std;

int main(void)
{
    int t,Case=0;
    int n,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        int ans=0;
        for(int i=2;i<=n;i++)
        {
            ans=(ans+k%i)%i;
        }
        printf("Case %d: %d\n",++Case,ans+1);
    }
    return 0;
}

1275 - Internet Service Providers

方程极值

#include<bits/stdc++.h>
using namespace std;

const double eps=1e-6;
int main(void)
{
    int t,Case=0;
    double n,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf",&n,&c);
        printf("Case %d: %d\n",++Case,n>eps?(int)(c/2/n+0.5-eps):0);
    }
    return 0;
}

1297 - Largest Box

方程极值

#include<bits/stdc++.h>
using namespace std;

double maxx(double w,double l)
{
    double a=12;
    double b=-4*(w+l);
    double c=w*l;
    double x=-b-sqrt(b*b-4*a*c);
    x/=2*a;
    return x;
}
double fun(double w,double l)
{
    double x=maxx(w,l);
    return (w-2*x)*(l-2*x)*x;
}
int main(void)
{
    int t,Case=0;
    double w,l;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf",&w,&l);
        printf("Case %d: %f\n",++Case,fun(w,l));
    }
    return 0;
}

1323 - Billiard Balls

碰撞可以为穿透,那么可以无视别的球直接求最终位置

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int x;
    int y;
    int dx;
    int dy;
} p[1010];
int cmp(const node a,const node b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
int main(void)
{
    int t,Case=0;
    int l,w,n,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&l,&w,&n,&k);
        char s[5];
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%s",&p[i].x,&p[i].y,s);
            if(s[0]=='N')
                p[i].dy=1;
            else
                p[i].dy=-1;
            if(s[1]=='W')
                p[i].dx=-1;
            else
                p[i].dx=1;
        }
        for(int i=0; i<n; i++)
        {
            p[i].x+=p[i].dx*k;
            p[i].y+=p[i].dy*k;
            while(!((p[i].x>=0)&&(p[i].x<=l)&&(p[i].y>=0)&&p[i].y<=w))
            {
                if(p[i].x<0)
                    p[i].x=-p[i].x;
                else if(p[i].x>l)
                    p[i].x=2*l-p[i].x;
                if(p[i].y<0)
                    p[i].y=-p[i].y;
                else if(p[i].y>w)
                    p[i].y=2*w-p[i].y;
            }
        }
        sort(p,p+n,cmp);
        printf("Case %d:\n",++Case);
        for(int i=0; i<n; i++)
            printf("%d %d\n",p[i].x,p[i].y);
    }
    return 0;
}

1349 - Aladdin and the Optimal Invitation

求中位数,每个点的人数即访问次数

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int x;
    int y;
    int z;
} p[50050];
int cmp1(const node a,const node b)
{
    return a.x<b.x;
}
int cmp2(const node a,const node b)
{
    return a.y<b.y;
}
int main(void)
{
    int t,Case=0;
    int m,n,q;
    int x,y,z;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&m,&n,&q);
        int sum=0;
        for(int i=0; i<q; i++)
        {
            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
            sum+=p[i].z;
        }
        sum=(sum+1)/2;
        sort(p,p+q,cmp1);
        z=0;
        for(int i=0; i<q; i++)
        {
            z+=p[i].z;
            if(z>=sum)
            {
                x=p[i].x;
                break;
            }
        }
        sort(p,p+q,cmp2);
        z=0;
        for(int i=0; i<q; i++)
        {
            z+=p[i].z;
            if(z>=sum)
            {
                y=p[i].y;
                break;
            }
        }
        printf("Case %d: %d %d\n",++Case,x,y);
    }
    return 0;
}

1369 - Answering Queries

理解代码块并优化

#include<bits/stdc++.h>
using namespace std;

long long a[100010];
int main(void)
{
    int t,Case=0;
    int n,q;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&q);
        for(int i=0; i<n; i++)
            scanf("%lld",&a[i]);
        long long sum=0;
        for(int i=0; i<n; i++)
            sum+=a[i]*(n-1-2*i);
        printf("Case %d:\n",++Case);
        int index;
        long long x,y;
        while(q--)
        {
            scanf("%d",&index);
            if(index==1)
                printf("%lld\n",sum);
            else
            {
                scanf("%lld%lld",&x,&y);
                sum-=a[x]*(n-1-2*x);
                a[x]=y;
                sum+=a[x]*(n-1-2*x);
            }
        }
    }
    return 0;
}

1410 - Consistent Verdicts

问方案数,干脆直接统计有多少个不同的距离

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int x;
    int y;
} p[701];
long long d[700*700+5];
int main(void)
{
    int t,Case=0;
    int n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int len=0;
        for(int i=0; i<n; i++)
        {
            scanf("%lld%lld",&p[i].x,&p[i].y);
            for(int j=0; j<i; j++)
                d[len++]=((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
        }
        sort(d,d+len);
        int ans=unique(d,d+len)-d;
        printf("Case %d: %d\n",++Case,ans+1);
    }
    return 0;
}

1430 - A Question of Time

这题一共交了20发,一共才24人AC,网上找都找不到题解,已刷吐

原本是用那个fun()直接求的,样例和自测数据都能过,交上去无限WA,所以改为二分(如果直接暴力复杂度是12*60*60*13*T==1e10会超时)

#include <bits/stdc++.h>
using namespace std;
//fun()=3600*(2*h0-hx)+60*(2*m0-13*mx)+2*s0
//13*sx=fun()
//13*sx=fun()+360*120
//13*sx=fun()-360*120
const double eps=1e-10;
const double eps2=1e-3;
int h0,m0,s0;
int t1,t2;
int ans[50];
int len;
double fun(int tmp)
{
    double h,m,s;
    s=tmp%(13*60)/13.0;
    tmp/=13*60;
    m=tmp%60;
    h=tmp/60;
    double ang0=(30*h0)+(m0/2.0)+(s0/120.0);
    double ang1=(30*h)+(m/2.0)+(s/120.0);
    double ang2=(6*m)+(s/10.0);
    return ang1+ang2-2*ang0;
}
int bs(int l,int r,double x)
{
    int mid;
    while(r-l>1)
    {
        mid=(l+r)/2;
        double cmp=fun(mid)-x;
        if(cmp>=eps)
            r=mid;
        else
            l=mid;
    }
    if(t1<=l&&l<=t2&&fabs(fun(l)-x)<eps2)
        return l;
    else if(t1<=r&&r<=t2&&fabs(fun(r)-x)<eps2)
        return r;
    return -1;
}
void solve(int i)
{
    int l=i*46800,r=l+46800-1;
    int tmp=bs(l,r,0.0);
    if(tmp!=-1)
    {
        ans[len++]=tmp;
    }
    tmp=bs(l,r,360.0);
    if(tmp!=-1)
    {
        ans[len++]=tmp;
    }
    tmp=bs(l,r,-360.0);
    if(tmp!=-1)
    {
        ans[len++]=tmp;
    }
}
int main()
{
    //freopen("in","r",stdin);
    //freopen("out","w",stdout);
    int t,Case=0;
    int h,m,s;
    scanf("%d",&t);
    while(t--)
    {
        len=0;
        scanf("%d:%d:%d",&h0,&m0,&s0);
        scanf("%d:%d:%d",&h,&m,&s);
        t1=((h*60+m)*60+s)*13;
        scanf("%d:%d:%d",&h,&m,&s);
        t2=((h*60+m)*60+s)*13;

        for(int i=0; i<12; i++)
        {
            solve(i);
        }

        sort(ans,ans+len);
        len=unique(ans,ans+len)-ans;
        printf("Case %d: %d\n",++Case,len);
        int mod;
        for(int i=0; i<len; i++)
        {
            mod=ans[i]%13;
            ans[i]/=13;
            s=ans[i]%60;
            ans[i]/=60;
            m=ans[i]%60;
            h=ans[i]/60;
            printf("%02d:%02d:%02d",h,m,s);
            if(mod)
                printf(" %d/13",mod);
            puts("");
        }
    }
}
时间: 2024-12-11 07:09:13

light oj Basic Math 数论基础的相关文章

lightoj Basic Math 数论基础

这里是除去Beginners Problems后的部分 1020 - A Childhood Game 巴什博奕(Bash Game) #include<bits/stdc++.h> using namespace std; int main(void) { int t,Case=0; int n; char s[10]; scanf("%d",&t); while(t--) { scanf("%d%s",&n,&s); prin

light oj 1236 【大数分解】

给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,--em, 则结果为((1+2*e1)*(1+2*e2)--(1+2*em)+1)/2. //light oj 1236 大数分解素因子 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #i

Light OJ 1251 Forming the Council 2-SAT输出任意一组解

题目来源:Light OJ 1251 Forming the Council 题意:若干了条件至少满足一个 求是否有方案 输出任意一种可能的方案 留下的人的个数 思路:2-SAT基础题 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 100010; int n, m; vector <int> G[maxn*2]; boo

light oj 1007 Mathematically Hard (欧拉函数)

题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a:若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1) 对于这题来说,首先卡MLE..只能开一个数组..所以把前缀和也存到欧拉数组里.然后卡long long..要用unsigned long long .

Light OJ 1080 - Binary Simulation - (线段树区间更新 单点查询)

Description Given a binary number, we are about to do some operations on the number. Two types of operations can be here. 'I i j'    which means invert the bit from i to j (inclusive) 'Q i'    answer whether the ith bit is 0 or 1 The MSB (most signif

[2016-04-21][light]OJ[1234][Harmonic Number]

时间:2016-04-21 22:18:26 星期四 题目编号:[2016-04-21][light]OJ[1234][Harmonic Number] 题目大意:求∑nk=11kn∈(1,108),精确到10?8求∑k=1n1kn∈(1,108),精确到10?8 分析: 想法是打表,然后输出,但是直接打表会爆内存 解决办法,就是每隔100个来打表,节省1100的空间,然后从那个值开始计算到当前值解决办法,就是每隔100个来打表,节省1100的空间,然后从那个值开始计算到当前值 对应的整百就是n

Light OJ 1411 Rip Van Winkle`s Code 线段树成段更新

题目来源:Light OJ 1411 Rip Van Winkle`s Code 题意:3中操作 1种查询 求区间和 其中每次可以把一段区间从左到右加上1,2,3,...或者从右到左加上...3,2,1 或者把某个区间的数都置为v 思路:我是加了6个域 add是这段区间每个数都要加上add  add是这么来的 对与123456...这个等差数列 可能要分为2个区间 那么我就分成123和123 两个右边的等差数列每个数还应该加上3 所以右区间add加3 v是这个区间都要置为v 他的优先级最高 b是

Light OJ 1168 Wishing Snake 强连通缩点+哈密顿通路

题目来源:Light OJ 1168 Wishing Snake 题意:有点难看懂题意 看了一个小时再加别人的代码才懂意思 从0开始 输入的那些每一对u v 都要经过 就是从0到到达那些点 思路:首先缩点 每一个强连通分量里面的点都是可达的 缩点后的图是有向无环图 如果从0这个强连通分量可以出去到2个强连通分量 那么这两个强连通分量是不可能相互可达 所以可行的方案就是所有的强连通分量连成一线 一个一个串起来 除了第一个 出度是1入度是0和最后一个出度是0入度是1 其他都是入度等于出度是1 特判只

Jan&#39;s light oj 01--二分搜索篇

碰到的一般题型:1.准确值二分查找,或者三分查找(类似二次函数的模型). 2.与计算几何相结合答案精度要求比较高的二分查找,有时与圆有关系时需要用到反三角函数利用 角度解题. 3.不好直接求解的一类计数问题,利用二分直接枚举可能的结果,再检查是否符合题目要求. 4.区间求解,即利用两次二分分别查找有序序列左右上下限,再求差算出总个数. 题型知识补充: 1. 三分的一般写法: 1 double thfind(double left,double right) 2 { 3 double midmid