牛客每日一题

今天突然发现牛客上的每日一题也很宝藏~!!!决定刷一下~~~持续更新

链接:https://ac.nowcoder.com/acm/problem/13221
来源:牛客网
数码(数论分块)

题目描述

给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。
 
倭瓜说一句,之前没学数论分块!有跟我一样的推:https://ac.nowcoder.com/acm/problem/blogs/13221
题解里有人讲解,很详细~~
 
 
链接: https://ac.nowcoder.com/acm/problem/14731
来源:牛客网

题目描述

求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位a i和a j(i<j),则a i=1,a j=0。
答案对1e9+7取模。
我真是太虚了!!组合数学还没看~~现在趁机学一波~,对于任意两个位置,假设其满足逆序对要求,则从中选出两个位置C(n,2),剩余各自安放,有2^n-2中选择;
(虽然 题解这样说,但我还是有点懵),外加模运算真的很难受!!
 
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll pow1(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n;
    cin>>n;
    if(n==1) cout<<0;
    else {
        ll ans1=pow1(2,n-2);
        ll k=((n%mod)*((n-1)%mod)/2);
        cout<<(ans1%mod)*(k%mod)%mod;
    }
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/23049
来源:牛客网

题目描述

二月中旬虐狗节前夕,华华决定给月月准备一份礼物。为了搭建礼物的底座,华华需要若干根同样长的木棍。华华手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干段自己想要的长度,并丢掉多余的部分。因为华华的手很巧,所以他的裁剪过程不会有任何的失误。也就是说,对于一根长度为N的木棍,华华可以精准的将它们裁剪为若干段木棍,使它们的长度之和为N。
华华不知道裁剪成多长比较好,所以干脆越长越好。不过由于华华有点强迫症,所以他希望长度为非负整数。保证所有木棍的原长也是非负整数。那么请问华华最终得到的每根木棍多长呢?
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 110000
ll n,k,max1=0;
ll L[maxn];
bool check(ll mid)
{
    ll ans=0;
    for(int i=1;i<=n;++i)
    {
        if(L[i]<mid) continue;
        ans+=L[i]/mid;
    }
    if(ans<k) return 0;
    else return 1;
}
int main()
{
    cin>>n>>k;
    for(ll i=1;i<=n;++i) cin>>L[i],max1=max(max1,L[i]);
    ll l=1,r=max1,h=0;
    while(l<r)
    {
        ll mid=(l+r)/2+1;
        if(check(mid)) h=mid,l=mid+1;
        else r=mid-1;
    }
    if(check(h+1)) cout<<h+1;
    else cout<<h;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Showend/p/12698892.html
今日推荐