【问题描述】
moreD在学习完循环小数之后发现循环是个很美好的性质。自己只需要记住短短的循环节以及循环次数(次数大于1,且是整数)就可以记住整个数字了。
因为背诵数字变得方便了,moreD决定背诵[L,R]内的所有循环的整数。moreD的背诵计划有T天,但是他不知道每天具体要背多少个数,请你帮助moreD计算出每天需要背诵的数字个数。
如果moreD在某天遇到一个曾经背过的数字,他会义无反顾地重新背诵。
【输入格式】 第一行给出一个整数T,表示moreD计划背诵T天的数字。 接下来n行,第i行给出2个整数Li,Ri,表示moreD第i天的背诵计划。
【输出格式】 输出T行,每行一个整数,表示第i天moreD需要背诵的数字个数。
【输入输出样例】
circulate.in
3
1 10000
55555 66666
10 100

circulate.out
108
2
9
【数据范围】
对于30%的数据 T*MAX{Ri}<=2*10^6
对于70%的数据MAX{Ri}<=2*10^6
对于100%的数据 T<=50000,1<=Li<=Ri<=2*10^18
【样例解释】
对于第2天,moreD只需要背诵55555,66666.
对于第3天,moreD只需要背诵11,22,33,44,55,66,77,88,99

(╯‵□′)╯︵┻━┻10的18次方!!

先让我们最容易想到的思路是 :算出1-r的循环数个数,再算出1-l的循环数个数,两者相减就完了;

如何求出1到一个数中循环数的数量,可以用到分治的思想:求一到n的循环数的个数,得到n的长度 length,把它转换成求1-10的length次方中的数量(此处有规律,打表)+10的length次方-n的数量;

比如求1-xxxx(某四位数)中的循环数个数,先求1-1000中的个数(即18),再求1000-xxxx的个数。xxxx可以划分为xx|xx(两个数字为一循环节)且都可以取到10-xx之间的数。因此1000-xxxx中间的循环数的个数=xx-10;所以总的循环数的个数为18+xx-10;

在尝试这个思路时,有一个细节要处理,就是第一个循环节在之后可能取不到(如1-123111,我们取不到123123这个循环数),这时需要将第一个循环节的大小加1;

/*代码如下(╯‵□′)╯︵┻━┻【因为还没测过,正确性有待商榷】

╮(╯▽╰)╭反正我自己的数据都是对的……

ヾ(。`Д´。)楼上滚蛋!赶紧去测啊喂!

= =划掉划掉,这个代码WA了,后面会改正再更新的*/

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int t;
long long f[];
long long xunhuanjie[];
int l_num[maxn],r_num[maxn];
long long ans[maxn];
int right,left;
void init()
{
freopen("circulate.in","r",stdin);
freopen("circulate.out","w",stdout);
}
long long work(int a[],int l)
{
int d[];
long long ans=;
for(int i=;i<l;i++) ans+=f[i];//1到l这个区间最少的循环数个数,作为基数记录下来;
long long num=;
for(int i=;i<l;i++)
{ if(l%i==)//如果i长度的循环节满足;
{
long long p=;
long long q=;
int w=;
for(int j=;j<=i;j++) q=q*+a[j];//记录第一个循环节的大小;
for(int j=i+;j<=l;j++)
{
p=p*+a[j];//记录第一个循环节以后的循环节大小;
if(j==l||j%i==)
{
if(p>q) break;//如果后面有任意一个循环节比第一个循环节小,则不能取到循环节,如123111,我们取不到循环节123(循环数为123123),此时让循环节加一,如果能取到,退出;
else if(p<q) w=;
p=;
}
}
xunhuanjie[i]=q-num-w+;//循环节减去循环的基数;
for(int j=;j<i;j++)
if(i%j==){
xunhuanjie[i]-=xunhuanjie[j];//减去重复的循环节;
}
ans+=xunhuanjie[i];
}
num=num*;
}
return ans;
}
void biao()//初始化,算出1到10的次方的区间的循环数个数;
{
for(int i=;i<;i++)
{
long long num=;
for(int j=;j<i;j++)//枚举循环节长度;
{
if(i%j==){
xunhuanjie[j]=num;
for(int k=;k<j;k++) if(j%k==) xunhuanjie[j]-=xunhuanjie[k];//减去重复的循环节;
f[i]+=xunhuanjie[j];
}
num=num*;
}
}
}
void read()
{
scanf("%d",&t);
for(int j=;j<=t;j++)
{
char l[],r[];
scanf("%s",l);
scanf("%s",r);
left=strlen(l);
right=strlen(r);
for(int i=;i<=strlen(l);i++) l_num[i]=l[i-]-'';
for(int i=;i<=strlen(r);i++) r_num[i]=r[i-]-'';
ans[j]=work(r_num,right)-work(l_num,left);
}
}
int main()
{
//init();
biao();
read();
for(int i=;i<=t;i++) printf("%lld\n",ans[i]);
return ;
}

【11.2noip冲刺赛】 循环整数 (分段打表)的更多相关文章

  1. 2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解

    题意: 传送门 已知\(F(n)=3F(n-1)+2F(n-2) \mod 998244353,F(0)=0,F(1)=1\),给出初始的\(n_1\)和询问次数\(q\),设每一次的答案\(a_i= ...

  2. 11.2NOIP模拟赛

    /* 根右左遍历后最长上升子序列 */ #include<iostream> #include<cstdio> #include<cstring> #include ...

  3. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  4. 2019南昌网络赛H The Nth Item(打表找询问循环节 or 分段打表)

    https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节, ...

  5. For循环输出九九乘法表

    题:使用For循环输出九九乘法表 解析: 1*1=1 1*2=2  2*2=4 1*3=3  2*3=6  3*3=9 .... 1*9=9  ........ .....9*9=81 可以看做j*i ...

  6. 编程题:利用for循环打印 9*9 表?

    利用for循环打印 9*9  表? 1*1=1 1*2=2  2*2=4 1*3=3  2*3=6  3*3=9 1*4=4  2*4=8  3*4=12  4*4=16 1*5=5  2*5=10  ...

  7. Harmonic Number LightOJ - 1234 (分段打表)

    题意: 求调和级数,但n很大啦.. 解析: 分段打表  每间隔50存储一个数,在计算时  只需要找到离输入的n最近的那个数 以它为起点 开始计算即可 emm...补充一下调和级数的运算公式   r为常 ...

  8. Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定

    Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...

  9. 写一个方法,用一个for循环打印九九乘法表

    public class MultiplicationTable { /**  * @description 写一个方法,用一个for循环打印九九乘法表   * @author  wangkun  * ...

随机推荐

  1. Spring整合Hibernate 二 - 声明式的事务管理

    Spring大战Hibernate之声明式的事务管理 Spring配置文件: 添加事务管理类的bean: <bean id="txManager" class="o ...

  2. jquery.form上传文件

    建立test文件夹 PHP代码: <?php //var_dump($_FILES['file']);exit; if(isset($_GET['option']) && $_G ...

  3. JS 之 innerHTML

    定义和用法 innerHTML 属性用于设置或返回指定标签之间的 HTML 内容. 语法 Object.innerHTML = "HTML";// 设置 var html = Ob ...

  4. MySQL数据库改名字

    在这里首先感谢那个网上已经给出了解决办法的同志 有很多MySQL数据库的初学者可能都会遇到一个关于改名字的问题,可能大家第一时间就会想到去网上搜搜,其实我跟大家的心理是一样的(呵呵). 据我所知,My ...

  5. 第一章——Activity的生命周期

    问题总结: 1.Activity完整的生命周期 2.当打开第二个Activity并关闭时候的生命周期. ①.解释为什么onPause()方法不要有耗时操作 3.Activity发生异常重启的时候问题: ...

  6. python核心编程-第四章-习题

    1.身份.类型.值.其中,身份是每个对象的标识,与内存地址密切相关,可用id()返回:类型决定了对象可以保存什么类型的值,用type()函数.isinstance()函数可以得到对象的类型:值就是对象 ...

  7. TCP协议: SYN ACK FIN RST PSH URG 详解

    TCP的三次握手是怎么进行的了:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给 ...

  8. U盘开发之SSD对比

    U盘因其小巧方便,逐步取代了笨重的移动硬盘和光驱,成为最普及的存储介质.现在的主板BIOS也将支持USB启动,作为标准之一,再过几年,光驱时代可能就要终结了.从早期的16MU盘,到现在动辄几个G,U盘 ...

  9. 一种全新的MEMS开关——高性能、快速、低能耗以及双稳态

    这种开关最早由申军教授和研究生阮梅春发明,研究生埃里克·朗格卢瓦在简化结构和缩小尺寸上作了探索,黄志林用相同原理做出了MEMS光学镜子开关,曹志良改变设计.材料和工艺后制作出了能同步开关的矩阵.这种M ...

  10. Spring再学习

    一.主要版本变更 框架最早发布于2004年,其后发布了几个重大的版本更新:在Spring 2.0中提供对XML命名空间和AspectJ的支持:Spring 2.5中新增了注解驱动的配置:在Spring ...