51nod-1359: 循环探求
【传送门:51nod-1359】
简要题意:
给出n和k,求出最小的x满足$n^{x}≡n(mod\;10^{k})$
题解:
真是一道有(du)趣(liu)题目
首先我们设X[k-1]为$n^{x}≡n(mod\;10^{k-1})$成立的最小的x
那么我们就可以得到$n^{X[k-1]}≡n(mod\;10^{k-1})$
设$N[k-1]=n^{X[k-1]}$
设t为任意值,可以发现$n^{t*X[k-1]}≡N[k-1]^{t}(mod\;10^{k-1})$
假设t*X[k-1]为满足$n^{x}≡n(mod\;10^{k})$的最小的x的话,其实可以知道变的只有第k位,而第1到第k-1位仍然是不变的,那么我们对于一个k就枚举t,因为抽屉原理,所以N[k-1]^t的第k位最多只有10种情况,t枚举到12都仍未找到则说明不存在x,就直接输出1
否则将得到的t连乘,最后+1就是答案了
PS:为了不超时,高精度的时候要控制长度在k以内,不会影响结果
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
int a[],len;
node()
{
len=;
memset(a,,sizeof(a));
}
}N,d;
char st[];int k;
node multi(node n1,node n2)
{
node no;no.len=k;
for(int i=;i<=k;i++)
{
for(int j=;j+i-<=k;j++) no.a[i+j-]+=n1.a[i]*n2.a[j];
}
for(int i=;i<=no.len;i++)
{
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
return no;
}
node solve(node n1,int n2)
{
node no;no.len=n1.len;
for(int i=;i<=no.len;i++) no.a[i]=n1.a[i]*n2;
for(int i=;i<=no.len;i++)
{
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
int i=no.len;
while(no.a[i+]>)
{
i++;
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
no.len=i;
return no;
}
int main()
{
scanf("%s%d",st+,&k);
int len=strlen(st+);N.len=len;
for(int i=;i<=len;i++) N.a[i]=st[len-i+]-'';
d.a[]=;d.len=;
node B=N,p,x;
for(int i=;i<=k;i++)
{
int t=;
x=B;
while(t<=)
{
p=multi(N,B);
if(p.a[i]==N.a[i]) break;
B=multi(B,x);t++;
}
if(t>){printf("1\n");return ;}
d=solve(d,t);
}
d.a[]++;
for(int i=;i<=d.len;i++)
{
d.a[i+]+=d.a[i]/;
d.a[i]%=;
}
int i=d.len;
while(d.a[i+]>)
{
i++;
d.a[i+]+=d.a[i]/;
d.a[i]%=;
}
d.len=i;
for(int i=d.len;i>=;i--) printf("%d",d.a[i]);
printf("\n");
return ;
}
51nod-1359: 循环探求的更多相关文章
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- 51nod 1050 循环数组最大子段和 (dp)
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1050¬iceId=13385 参考:http://blog. ...
- 51nod 1050 循环数组最大子段和 单调队列优化DP
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这个呢,这个题之前 求一遍最大值 然后求一遍最小值 ...
- 51Nod 1050 循环数组最大子段和 | DP
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n] ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该 ...
- 51nod 1050 循环数组最大子段和【动态规划】
N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n] ...
- 基础dp 记录
51nod 1134 最长递增子序列 #include<iostream> #include<cstdio> #include<cstring> #include& ...
- 51nod 循环数组最大子段和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...
- 51nod 1035 最长的循环节 数学
1035 最长的循环节 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1035 Description 正整 ...
随机推荐
- Linux Mint (应用软件— 虚拟机:Virtualbox续)
我已经在当前的电脑中安装好了虚拟机.并且在虚拟机中安装了Ubuntu14.04LTS系统.接下来能够開始自己的折腾之旅了. 開始使用的时候总是感觉显示有问题,根据经验来看同,是系统分辨率设置不当引起的 ...
- SPFA(Shortest Path Faster Algorithm)
特别说明 本文转载自三金(frinemore)的博客: 点这 前言 1.关于SPFA,它没死. 2.接下来的所有代码,都是自己手写的(未检查正确性,补充的代码有检查过,是对的),有错误请帮忙指出. S ...
- htmlunit 简单操作
首先我们新建一个Maven普通客户端项目,然后打开pom.xml 引入htmlunit支持: <dependency> <groupId>net.sourceforge.htm ...
- 关于TCP的三次握手和四次分手 专题
客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSE ...
- SQLSERVER 链接服务器执行存储过程
1.创建链接服务器 exec sp_addlinkedserver 'server_tmp','','SQLOLEDB','192.168.1.1' -- server_tmp 为别名 exec sp ...
- redis的主从模式
主从通信过程 Master配置: 1:关闭rdb快照(备份工作交给slave) 2:可以开启aof slave配置: 1: 声明slave-of slaveof 192.168.0.102 2: 配置 ...
- SQL学习——基础语句(3)
先上数据表 student表 grade 表 SQL Union 语句 合并两个或多个select查询结果集. select s_id from student union select s_id ...
- CoordinatorLayout:android之ScrollingActivity
1.效果图 2.新建SrcollingActivity后生成代码为: <?xml version="1.0" encoding="utf-8"?> ...
- vue-cli webpack配置中 如何启动less-loader sass-loader
在vue-cli中构建的项目是可以使用less的,但是查看package.json可以发现,并没有less相关的插件,所以我们需要自行安装. //第一步:安装 npm install less les ...
- RunLoop主要处理以下6类事件
1.Observer事件,runloop中状态变化时进行通知.(微信卡顿监控就是利用这个事件通知来记录下最近一次main runloop活动时间,在另一个check线程中用定时器检测当前时间距离最后一 ...