[结论][高精度除法]JZOJ 3771 小Z的烦恼

Description

小 Z 最近遇上了大麻烦,他的数学分析挂科了。于是他只好找数分老师求情。

善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1~n 的球和 m 个盒子,每个球都可以放进且只能放进一个盒子里面,但是要满足如下的规则:

1.  若把标号为 i 的球放进了第 j 个盒子,那么标号为 2*i 的球一定要在第 j+1 个盒子里面(若 j<m)

2.  若把标号为 i 的球放进了第 j 个盒子,并且 k*2=i,那么标号为 k 的球一定要在第 j-1 个盒子里面(若 j>1)

小 Z 的数分老师想要知道,给定了 n 和 m 的时候,第一个盒子最多能放进去多少个球。事实上,他已经推算出了公式,但是需要检验当 n 趋向于无穷大时是否仍然满足这个公式,因此 n 可能会非常大。

Input

本题包含多组数据,第一行为一个数(T<=20),表示数据组数;以下 T 行,每组数据一行,包括两个数 n 和 m。

Output

每组数据输出一行,包括一个数,即第一个盒子最多能放进多少个球。

Sample Input

2
10 2
10 3

Sample Output

4
1
 

Data Constraint

对于 10%的数据,n<=10^6

对于 20%的数据,n<=10^9

对于 30%的数据,m=2

对于 100%的数据,n<=10^10000,2<=m<=25

Hint

样例解释:

(1).{1,3,4,5}, {2,6,8,10}

(2).{1},{2},{4}

分析

今日份最难

经过一番推规律,我们可以得到如下结论

放在第一个盒子里的数必定满足:

a*2x(x≡0(mod m) a≡1(mod 2) a*2x+m-1≤n )

那就很简单啦,我们只需要先给n除掉2m-1,然后统计n中的奇数个数,然后再除2m,再判断,重复即可

因为n比较大所以需要高精度除法

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e3+10;
const ll P=1e11;
ll a[N],b[N];
int T,m,lena,lenb;
char s[N*10];

void Div(ll x) {
    ll fm=0;
    for (int i=lena;i;i--)
        a[i]=fm*P+a[i],fm=a[i]%x,a[i]/=x;
    while (!a[lena]&&lena) lena--;
}

void Plus() {
    ll fm=0;
    for (int i=lena;i;i--)
        b[i]+=(fm*P+a[i])/2ll,fm=a[i]%2ll;
    lenb=max(lena-1,lenb);
    if (b[lenb+1]) lenb++;
    for (int i=1;i<=lenb;i++)
        b[i+1]+=b[i]/P,b[i]%=P;
    if (b[lenb+1]) lenb++;
}

int main() {
    for (scanf("%d",&T);T;T--) {
        memset(a,0,sizeof a);memset(b,0,sizeof b);
        scanf("%s%d",s+1,&m);int len=strlen(s+1);
        ll j=1;lena=1;lenb=0;
        for (int i=len;i;i--) {
            a[lena]+=(s[i]-‘0‘)*j;j*=10ll;
            if (j==P) j=1,lena++;
        }
        Div(1ll<<m-1);
        do {
            j=a[1]%2;
            Plus();
            b[1]+=j;
            Div(1ll<<m);
        }
        while (lena);
        if (!lenb) lenb++;
        printf("%lld",b[lenb]);
        for (int i=lenb-1;i>0;i--) {
            j=P/10ll;
            while (b[i]<j&&j)
                printf("0"),j/=10ll;
            printf("%lld",b[i]);
        }
        printf("\n");
    }
}

原文地址:https://www.cnblogs.com/mastervan/p/10292776.html

时间: 2024-11-11 21:40:59

[结论][高精度除法]JZOJ 3771 小Z的烦恼的相关文章

[高精度][数学] Jzoj P3771 小Z的烦恼

Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1-n 的球和 m 个盒子,每个球都可以放进且只能放进一个盒子里面,但是要满足如下的规则: 1.  若把标号为 i 的球放进了第 j 个盒子,那么标号为 2*i 的球一定要在第 j+1 个盒子里面(若 j<m) 2.  若把标号为 i 的球放进了第 j 个盒子,并且 k*2=i,那么标号为 k 的球一

小Z解读:企业证书利用itms-services协议分发应用在蜂窝网络下的限制

小Z最近在工作中遇到这样一个问题,跟国内许多公司一样,我们也会采用苹果企业证书来分发应用,作为一枚屌丝开发,小Z真的很少会在蜂窝网络中去下载APP这种数据量较大的不明物体啦,然而随着4G在中国的不断普及,财大气粗的大佬们似乎早就已经在蜂窝网络下任性地干着一切他们想干的了呢,虽然小Z还没有数据表明这部分用户的占比.小Z遇到的问题是,蜂窝网络下采用itms-services协议安装在远程服务器上超过100MB大小的应用,iOS桌面的下载进度几乎不动,于是接到大佬们的反馈是"在3G/4G下无法下载&q

【算法学习笔记】34.高精度除法 SJTU OJ 1026/1016

高精度除法, 这个和加减乘一样,我们都要从手算的角度入手.举一个例子,比如 524134 除以 123.结果是4261 第一位4的来源是 我们把 524和123对齐,然后进行循环减法,循环了4次,余32,将32134的前三位321继续和123对齐,循环减法2次,余75,把7534的前三位753和123对齐,循环减法6次,余15,将154和123对齐,只能减1次,所以结果是4 2 6 1. 把上述过程程序化 1.把A,B两个数存入char数组 0下标表示的是最高位2.把A的前lenB位和B对齐进行

莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 6475  Solved: 3004[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜

bzoj 2038 小Z的袜子(hose)(莫队算法)

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 11542  Solved: 5166[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命--具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

[国家集训队2010]小Z的袜子

★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便

BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只

【算法:1】高精度除法

高精度除法,我用高精度减法来模拟 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> using namespace std; inline int read() { int x=0,f=1;char ch=getchar();

清橙A1206 小Z的袜子(莫队算法)

A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB 总提交次数:744   AC次数:210   平均分:44.44 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2010中国国家集训队命题答辩 问题描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是