首页 > 其他分享 >51nod 1799 二分答案

51nod 1799 二分答案

时间:2023-04-04 12:02:49浏览次数:29  
标签:二分 1799 示例 51nod 打乱 答案 define


1799 二分答案
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注
lyk最近在研究二分答案类的问题。
对于一个有n个互不相同的数且从小到大的正整数数列a(其中最大值不超过n),若要找一个在a中出现过的数字m,一个正确的二分程序是这样子的:


l=1; r=n; mid=(l+r)/2; 
 while (l<=r) 
 { 
 if (a[mid]<=m) l=mid+1; else r=mid-1; 
 mid=(l+r)/2; 
 }

最终a[r]一定等于m。
但是这个和谐的程序被熊孩子打乱了。
熊孩子在一开始就将a数组打乱顺序。(共有n!种可能)
lyk想知道最终r=k的期望。
由于小数点非常麻烦,所以你只需输出将答案乘以n!后对1000000007取模就可以了。

在样例中,共有2个数,被熊孩子打乱后的数列共有两种可能(1,2)或者(2,1),其中(1,2)经过上述操作后r=1,(2,1)经过上述操作后r=0。r=k的期望为0.5,0.5*2!=1,所以输出1。
Input
3个整数n,m,k(1<=m<=n<=10^9,0<=k<=n)。
Output
一行表示答案
Input示例
2 1 1
Output示例
1
alpq654321 (题目提供者)


【分析】

分块打表+排列


【代码】

//51nod 二分答案 
#include<bits/stdc++.h>
#define N 50
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mod=1000000007;
int n,m,k,b,s;
int Y[1000]={
1,924724006,582347126,500419162,881147799,693776109,435873621,279027658,727951124,398578768,678364145,204828554,345795998,116118093,359401113,236930793,856493327,207383191,617606889,933753281,26701748,329394893,360779992,416008308,187501984,165706817,328891607,16385287,117411011,404196042,765064133,239669664,761588352,566114869,673499119,840260100,352356536,53839501,178657924,373444237,227300165,207172723,444208499,367531373,297449176,605324209,729265513,567907756,125889461,250743107,666666670,598576559,632705086,295855233,185718228,414607857,737215408,863388390,182290465,707552496,881713600,417895708,490627919,364521407,775935292,972492338,473340273,920880265,530581,696910290,64037482,649527920,756691728,283805222,711255329,825205499,263679166,341083474,914727729,919247968,465317279,960145703,274813468,393588827,65909169,521964827,794328994,484551338,521297378,54488990,591837535,255746228,25827429,177799409,92011129,469664591,35708489,197025781,288851931,254032854
};
inline void find()
{
    int l,r,mid;
    l=1; r=n; mid=(l+r)/2;
    while (l<=r)
    {
        if (mid<=k) l=mid+1,s++; else r=mid-1,b++;
        mid=(l+r)/2;
    }
}
inline int A(int n,int m)
{
    int i,res=1;
    if(n<m) return 0;
    fo(i,n-m+1,n) res=(ll)res*i%mod;
    return res;
}
int get(int x)
{
    if (x==0) return 1;
    int y,i=Y[(x-1)/10000000], j=(x-1)%10000000;
    ll c=x/10000000*10000000+1;
    fo(y,1,j) i=(ll)i*(c+y)%mod;
    return i;
}
int main()
{
    int i,j,l,r,ans;
    scanf("%d%d%d",&n,&m,&k);
    find();
    ans=(ll)A(m,s)*A(n-m,b)%mod;
    ans=(ll)ans*get(n-b-s)%mod;
    printf("%d\n",ans);
    return 0;
}


标签:二分,1799,示例,51nod,打乱,答案,define
From: https://blog.51cto.com/u_15967757/6168370

相关文章

  • 51nod 1551 集合交易
    1551 集合交易题目来源: CodeForces基准时间限制:1 秒空间限制:131072 KB分值: 320 难度:7级算法题 收藏 关注市场中有n个集合在卖。我们想买到满足以下要求的一些集合,所买到集合的个数要等于所有买到的集合合并后的元素的个数......
  • 51nod 1370 排列与操作
    1370 排列与操作题目来源: TopCoder基准时间限制:2 秒空间限制:131072 KB分值: 320 难度:7级算法题 收藏 关注给定N长排列P,其中排列指数集{1,2,3...N}组成的一个序列,序列中每个元素恰好出现一次。初始时这个排列是给出的。之......
  • 51nod 1486 大大走格子
    1486 大大走格子题目来源: CodeForces基准时间限制:1 秒空间限制:131072 KB分值: 160 难度:6级算法题 收藏 关注有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。Input单组测试数据......
  • 51nod 1149 Pi的递推式
    1149 Pi的递推式基准时间限制:1 秒空间限制:131072 KB分值: 640 难度:8级算法题 收藏 关注F(x)=1(0<=x<4)F(x)=F(x-1)+F(x-pi)(4<=x)Pi=3.1415926535.....现在给出一个N,求F(N)。由于结果巨......
  • 17搜索二分题目目录
    ProblemA:Canyousolvethisequation?(HDU2199)  点击这里ProblemB:Strangefuction(HDU2899) 点击这里ProblemC:Pie(HDU1969)  点击这里ProblemD:Toxophily(HDU2298)(三分加二分)  点击这里ProblemE:Turnthecorner(HDU2438) 点击这里ProblemF:LineBelt(HDU3400)(三......
  • Maze 第二十届浙大城市学院程序设计竞赛 (二分图,网络流(对于表格,矩阵是如何建边的))
    题目大意:给出一个01矩阵,给出q,p分别表示选一个点的权值,和选2个连在一起的点的权值问如何让权值更大 注意:在Dinic的时间复杂度对于二分图这种边权为1,时间复杂度为NsqrtN, 不是n^2m  思路:更具题目的条件限制,他的建边一定是2个矮在一起的因此更具(i......
  • 分巧克力 | 二分
      P8647[蓝桥杯2017省AB]分巧克力-洛谷|计算机科学教育新生态(luogu.com.cn)一图说清下述两种代码孰对孰错的原因:  错误代码:#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;#defineios_base\ios::sync_with_stdio(f......
  • POJ 2773 Happy 2006 二分+容斥原理(二进制枚举或dfs)
    Happy2006TimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 14003 Accepted: 4946DescriptionTwopositiveintegersaresaidtoberelativelyprimetoeachotheriftheGreatCommonDivisor(GCD)is1.Forinstance,1,3,5,7,9...areallrelativel......
  • 从二分搜索到二叉搜索树
    引言打算写写树形数据结构:二叉查找树、红黑树、跳表和B树。这些数据结构都是为了解决同一个基本问题:如何快速地对一个大集合执行增删改查。本篇是第一篇,讲讲搜索树的基础:二叉搜索树。基本问题如何在一千万个手机号中快速找到13012345432这个号(以及相关联信息,如号主姓名)?......
  • 二分查找(算法笔记)
    核心代码(循环):intf=-1;while(left<=right){intmid=(left+right)/2;if(a[mid]==key){f=mid;break;}if(key<a[mid])right=mid-1;if(key>a[mid])left=mid+1;}if(f==-1)cout<<“没找到”elsecout<<f<<endl......