学习第四天

祝贺f♂a国夺得世界杯冠军!
(和我有什么关系?我又没看)
好了,我们继续今天的学习。
不得不提一下,我今天学习效率超高,感觉很高兴,在这里提一下。
下面,日常先看信息学!

信息学

第一题:货车运输

没错,就是昨天那道题,我把它写好了:货车运输题解

下面我们复习一下二分答案。

第二题:跳石头

这题是个很经典的二分答案
思路也很简单,就是二分答案。
具体分析见:跳石头题解

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int c,n,m;
int d[50005];
bool judge(int dd){
    int ans=0,cur=0;
    for(int i=1;i<=n+1;i++){
        if(d[i]-cur<dd){
            ans++;
        }else{
            cur=d[i];
        }
    }
    return ans>m;
}
int main(){
    scanf("%d%d%d",&c,&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&d[i]);
    }
    d[0]=0;
    d[n+1]=c;
    int l=1,r=c;
    while(l+1<r){
        int mid=(l+r+1)>>1;
        if(judge(mid)){
            r=mid;
        }else{
            l=mid;
        }
    }
    if(!judge(r)){
        l=r;
    }
    printf("%d",l);
    return 0;
}

二分答案,今天先看到这,明天再做一道二分答案的题。

下面我们来看看数学相关的知识点。

第三题:Hankson的趣味题

怎么讲呢?感觉这一题的难度给高了。
其实涉及的数学推理其实并不难,而且一旦数学推理结束,就是暴力枚举了,而且代码也短没什么难度。
所以我们就进行一下关键的数学分析。
我们要求x满足一下要求:

  1. (x,a0)=a1
  2. [x,b0]=b1

括号是什么意思,大家应该知道。
我们不妨设:

  • x=m*a1
  • a0=a*a1
  • b1=n*x
  • b1=b*b0

其中,m、a、n、b均为正整数。
分析条件1,可以得到(a,m)=1
分析条件2,可以得到(n,b)=1
再由我们设的式子可以得到:b1=m*n*a1
所以我们只要枚举m(因为m*n=b1/a1是一个定值),即可确定有多少个x。
因为x显然由m和n唯一确定,也就是两者一一对应(对应原理)
由m和n的乘积,我们知道b1/a1必须是个整数,所以我们可以判断一下,如果不是,直接输出0就行了。
接下来是枚举,由于数据比较大,我们可以采取每次枚举两对m和n,比如我们令up=b1/a1,枚举到i时,我们可以检验m=i、n=up/i和m=up/i、n=i,这样我们的i只需要枚举到i*i<=up即可,否则,如果你把i枚举到up,是会T的。
接下来,还要注意m==n的情况,不要重复计算。
所以,代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int a0,a1,b0,b1;
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    scanf("%d",&n);
    while(n--){
        int ans=0;
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        int a=a0/a1,b=b1/b0;
        int up=b1/a1;
        double check=(double)b1/(double)a1;
        if(check!=(double)up){
            printf("0\n");
            continue;
        }
        for(int i=1;i*i<=up;i++){
            if(up%i==0){
                if((gcd(a,i)==1)&&(gcd(b,up/i)==1)){
                    ans++;
                }
                if((gcd(a,up/i)==1)&&(gcd(b,i)==1)){
                    if(i!=up/i){
                        ans++;
                    }

                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

物理

今天看了带电粒子在电场中的运动,非常简单,还没有平时做的题难。

数学

简单看了集合中的最大和最小问题。
又看了不动点的问题,总结了几个方法:

  1. 通过对不动点的分析入手题目
  2. 利用不动点解方程
  3. 还有牛顿切线法解方程
  4. 不动点是某些题目
  5. 不动点还可以求函数的n次迭代的形式

还没看完,明天会继续探索。

总结

今天效率很高,明天加油,再把效率提高一层楼!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值