1359 循环探求

输入n和k,求最小 x(x>1) x (x > 1)使得

nx%10k==n%10k n^x \% 10^k == n \% 10^k

这里要求 x>1,因为x==1时必然有

n1%10k==n%10k n^1 \% 10^k == n \% 10^k

先回忆朴素的大数乘法运算。
对于两个大数

A,B A,B

A∗B=CA*B=C

其中

A[i],B[i],C[i] A[i] , B[i] , C[i]

分别对应大数字的第i为数字

因为:

A∗B % 10k=(A%10k+B%10k)%10k=C%10kA*B \ \%\ 10^k\\=(A\%10^k+B\%10^k)\%10^k\\=C\%10^k

所以:

C[0...k]可以由A[0...k]∗B[0...k]得来其中[0...k]表示对应大数的第0到k位C[0...k]可以由A[0...k]*B[0...k]得来\\其中[0...k]表示对应大数的第0到k位

在大数乘法的过程。直接截断;(建议朴素算法

因为我们要确定一个最小的x 使得

nx的后k位于n的后k位数相同的n^x的后k位于n的后k位数相同的

假设我们已经计算出来了。使得

nx的后k−1位于n的后k−1位数相同的n^x的后k-1位于n的后k-1位数相同的

最小的x,记为

X[k−1]X[k-1]

首先,我们有

nt∗X[k−1]%10k−1=n%10k−1n^{t*X[k-1]}\%10^{k-1}=n\%10^{k-1}

nX[k]=N[k]n^{X[k]}=N[k]

那么

nt∗X[k−1]%10k−1=N[k−1]tn^{t*X[k-1]}\%10^{k-1}=N[k-1]^t

随着t的增加 第k位在不断的改变。但是0到k-1位始终不变。
那么第一次出现

N[k−1]t10k=n10k的t时(t>=1)则此时 answer=X[k−1]∗t\frac{N[k-1]^t}{10^k}=\frac{n}{10^k}的t时(t>=1)\\则此时 \ answer=X[k-1]*t

如过我们记录的是循环次数cnt那么t=cnt+1如过我们记录的是循环次数 cnt\\那么t= cnt+1

我们知道 。判断新的一位时,我们用了暴力循环
但这并不意味着很差的时间复杂度
此时。我们只关心 。我们新的一位的数字。而不要去考虑更高位
那么对于这一位。最多有

0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9

割舍原理告诉我们
循环最多11次便会出现之前出现过的数了。
我们吧循环次数设置为20次。如果没有出现我们需要的t 结束循环,

其实可以设置更少的循环次数。
我们假设出现的环 长度为L。从最初状态进入环的路径长度最多为 11-L。
那也就是说 循环11次就已经遍历了所有可能。
下面给出为之前的AC代码

#include <algorithm>
#include <stdio.h>
#include <string.h>
#define MAX 1000000000
#define MAX_ 100000000
using namespace std;
typedef long long LL;
LL G[10]={1};
LL A[100];
LL B[100];
int C[650];
LL U[100];
LL Nx1[100];
LL Nx2[100];
int ans[5000];
int k;
char s[700];
void read()
{scanf("%s %d",s,&k);int len=(int)strlen(s);int deep=0;for(int i=len-1;i>-1;i-=9,deep++)for(int j=i,sz=max(-1,i-9),t=0;j>sz;j--,t++)A[deep]+=G[t]*(LL)(s[j]-'0');
}
void slove1()
{memset(U,0,sizeof(U));for(LL i=0;i<k;i++)for(LL j=0,c=0;j+i<k;j++){U[i+j]+=Nx1[i]*Nx2[j]+c;c=U[i+j]/MAX;U[i+j]-=c*MAX;}for(int i=0;i<k;i++)Nx1[i]=U[i];
}
void slove2()
{memset(U,0,sizeof(U));for(LL i=0;i<k;i++)for(LL j=0,c=0;j+i<k;j++){U[i+j]+=Nx1[i]*B[j]+c;c=U[i+j]/MAX;U[i+j]-=c*MAX;}for(LL i=0;i<k;i++)A[i]=U[i];
}
int main ()
{for(int i=1;i<10;i++)G[i]=G[i-1]*10;read();int K=k;k=k/9+1;for(int i=0;i<k;i++)Nx2[i]=B[i]=A[i];Nx1[0]=1;for(int i=0;i<K;i++){for(int j=0;j<k;j++)A[j]=B[j];int dx=i/9;int dd=i%9;LL IN=(B[dx]/G[dd])%10;do{slove1();slove2();ans[i]++;}while(IN!=((A[dx]/G[dd])%10)&&ans[i]<12);if(ans[i]>11){printf("1\n");return 0;}for(int j=0;j<k;j++)Nx2[j]=Nx1[j];memset(Nx1,0,sizeof(Nx1));Nx1[0]=1;}C[0]=1;int deep=1;for(int i=0;i<K;i++){int j,c;for(j=0,c=0;j<deep||c>0;j++){C[j]*=ans[i];C[j]+=c;c=C[j]/10000;C[j]-=c*10000;}deep=max(deep,j);}C[0]++;int i,c;for(i=0,c=0;i<deep||c>0;i++){C[i]+=c;c=C[i]/10000;C[i]-=c*10000;if(c==0)break;}deep=max(i,deep);deep--;printf("%d",C[deep--]);while(deep>-1)printf("%04d",C[deep--]);printf("\n");return 0;
}

51nod 1359 循环探求相关推荐

  1. 51nod 1050循环数组最大字段和

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 思路解析:一开始想着直接将长度为n的数组延长至2n-1 ...

  2. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  3. 51Nod 1050 循环数组最大子段和

    有两种方式: 1.在首尾之间 2.在尾首之间 对于第一种直接来dp就好,第二种需要将其数组全部取负,然后取到其最大值(肯定是负数的最大值)然后dp即可,最后比较这两个答案谁比较大就输出哪个 1 #in ...

  4. 中兴面试总结,华为。技术,市场

    1,软件测试,如何把这个测试做的更好. 进到一个新项目,作为测试人员应该都是想把测试做好,项目在符合客户质量要求的情况下按时交付的吧.但往往都事与愿违,造成这个结果的原因有很多很多.通过这段时间做自动 ...

  5. 【51nod - 1050】循环数组最大子段和(dp)

    题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...

  6. NOIP2005普及组第4题 循环

    NOIP2005普及组第4题 循环 时间限制: 1 Sec  内存限制: 128 MB 提交: 27  解决: 6 [提交][状态][讨论版][命题人:外部导入] 题目描述 乐乐是一个聪明而又勤奋好学 ...

  7. 51Nod - 1035 最长的循环节

    51Nod - 1035 最长的循环节 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有 ...

  8. 用forif循环测量minst0-6的特征迭代次数曲线

    制作一个网络输入minst的0-6的前5000张图片,将28*28的图片处理成9*9,网络结构是81*49*30*3让这个网络向1,1,1收敛, 将这个网络简写成 S(Minst 0-6)81-(co ...

  9. 计蒜客/51Nod题目

    题目 换位置(1) 链接https://nanti.jisuanke.com/t/T1971 思路:两两交换次序使得数组逆序,第一个到最后位置需要n-1步,第二个到倒数第二个需要n-2步,第三个到倒数 ...

  10. 51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1125 1125 交换机器的最小代价 基准时间限制:1 秒 ...

最新文章

  1. 剑指Offer_08_跳台阶
  2. Lesson 2.张量的索引、分片、合并以及维度调整
  3. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  4. 轻松搞定python中模板和包的使用
  5. C语言程序练习-L1-032 Left-pad (20分)
  6. RocketMQ消息支持的模式-消息同步发送
  7. “砸7000万,这样的黑锅我们也不背。” 华人银行家的反击
  8. vsftpd 源码安装 linux/redhat
  9. springBoot框架方法上面添加@Transactional注解的使用
  10. vue-cli 搭建的项目处理不同环境下请求不同域名的问题
  11. Linux网络配置之虚拟网卡的配置(Red Hat 6.5)
  12. 程序员养猫,并不是用来撸的!
  13. matlab读取npy文件
  14. 北漂生活第十四弹-5.24 兜兜转转又是一周
  15. 坚果云 android 操作历史,坚果云怎样将文件恢复到某一个历史版本?两招轻松搞定!...
  16. Visual paradigm试用版绘制ER图时如何去水印
  17. 微服务-高并发-思路
  18. 【前端单元测试入门03】Sinon
  19. 购物车模块redis和mysql_redis解决购物车的问题
  20. ASP.NET Core MVC_Tag Helper

热门文章

  1. Cisco路由器的配置
  2. 织梦网站模板的建站优势
  3. Windows Sever 2012 R2 组策略将everyone权限应用于匿名用户
  4. python识别字符串码置_python 字符串内置方法整理
  5. java实现电脑定时关机重启_利用任务计划程序实现电脑自动定时关机
  6. 【音视频基础】H264格式分析
  7. MacOS自带ssh+XQuartz连接OpenBSD6.5
  8. 前沿探索:腾讯云数据库自治服务最佳实现
  9. P2P组内通信与节电模式
  10. .net 简单的后台合成图片