HDU 5690——All X——————【快速幂 | 循环节】

时间:2021-11-25 00:14:17

All X

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 879    Accepted Submission(s): 421

Problem Description
F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:

F(x,m) mod k ≡ c

 
Input
第一行一个整数T,表示T组数据。
每组测试数据占一行,包含四个数字x,m,k,c

1≤x≤9

1≤m≤1010

0≤c<k≤10,000

 
Output
对于每组数据,输出两行:
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
 
Sample Input
3
1 3 5 2
1 3 5 1
3 5 99 69
 
Sample Output
Case #1:
No
Case #2:
Yes
Case #3:
Yes
Hint

对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。

 
Source
 
 
解题思路:打表找循环节。
 
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
#pragma comment(linker, "/STACK:102400000,102400000")
const int maxn = 1e5 + 300;
const LL INF = 0x3f3f3f3f;
typedef long long LL;
typedef unsigned long long ULL;
LL vis[maxn], a[maxn];
int main(){
LL x, m, k, c;
int T, cas = 0;
scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld%lld",&x,&m,&k,&c);
memset(vis,0,sizeof(vis));
int nn = 0, le = 0, st = 1;
LL cc;
LL n = 0;
for(int i = 1; ; i++){
n = n*10;
n = n + x;
n = n%k;
if(vis[n]){
cc = n;
break;
}else{
vis[n] = 1;
nn++;
a[nn] = n;
}
}
for(int i = 1; i <= nn; i++){
if(a[i] == cc){
le = nn+1 - i;
st = i;
break;
}
}
int flag = 0;
if(m < st){
if(a[m] == c){
flag = 1;
}
}else{
m -= st;
m %= le;
if(a[st+m] == c){
flag = 1;
}
}
printf("Case #%d:\n",++cas);
if(flag) puts("Yes");
else puts("No");
}
return 0;
} /*
55
3 5 99 69 3 4 4 2
3 8 4 2 2 8 3 2 */

  

解题思路:数学方法。

转自http://m.blog.csdn.net/article/details?id=51471639

HDU 5690——All X——————【快速幂 | 循环节】

这个数要mod k ,那这个数应该怎么表示呢?

HDU 5690——All X——————【快速幂 | 循环节】

就这样转化了,然后10^m可以通过快速幂解决,但是很明显,除以9操作怎么办,除法取模,余数是会改变的,逆元?但是9和k不一定互质,且k也不一定是质数,所以扩展欧几里得和费马小定理都不能用了,束手无策

好吧,这里提供一种小方法

HDU 5690——All X——————【快速幂 | 循环节】

HDU 5690——All X——————【快速幂 | 循环节】

就这样经过几步转化,我求d不需要进行除法取模了,那我上面的问题不就解决了?对的。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
#pragma comment(linker, "/STACK:102400000,102400000")
const int maxn = 1e5 + 300;
const LL INF = 0x3f3f3f3f;
typedef long long LL;
typedef unsigned long long ULL;
LL quick(LL x,LL n,LL p){
if(n == 0) return 1;
LL ret = 1;
while(n){
if(n&1) ret = ret*x % p;
n = n >> 1;
x = x*x % p;
}
return ret;
}
int main(){
LL x, m, k, c;
int T, cas = 0;
scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld%lld",&x,&m,&k,&c);
k*=9;
LL ans = quick(10,m,k);
ans = (ans - 1 + k) % k;
ans /= 9;
k /= 9;
ans = ans * x % k;
bool flag = 0;
if(ans == c)
flag = 1;
printf("Case #%d:\n",++cas);
if(flag) puts("Yes");
else puts("No");
}
return 0;
}

  

HDU 5690——All X——————【快速幂 | 循环节】的更多相关文章

  1. HDU——4291A Short problem(矩阵快速幂&plus;循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. 2016&quot&semi;百度之星&quot&semi; - 初赛(Astar Round2A)--HDU 5690 &vert;数学转化&plus;快速幂

    Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69   Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint ...

  3. hdu 4291 矩阵幂 循环节

    http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109  ...

  4. HDU 1061 Rightmost Digit --- 快速幂取模

    HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...

  5. HDU 3977 斐波那契循环节

    这类型的题目其实没什么意思..知道怎么做后,就有固定套路了..而且感觉这东西要出的很难的话,有这种方法解常数会比较大吧..所以一般最多套一些比较简单的直接可以暴力求循环节的题目了.. /** @Dat ...

  6. HDU&period;2640 Queuing &lpar;矩阵快速幂&rpar;

    HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...

  7. HDU 5667 构造矩阵快速幂

    HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...

  8. HDU 6185 Covering 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...

  9. hdu 3746 Cyclic Nacklace&lpar;kmp最小循环节&rpar;

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

随机推荐

  1. 关于UIView的显示问题

    今天在倒腾PP助手SDK的接入,游戏框架使用的是cocos2d-x,因为不熟悉iOS的UIKit,所以费了点功夫终于让SDK的登录页面显示出来了,问题来了,在iOS设备landscape显示模式UI显 ...

  2. IOS密码加密

    一般使用两种加密技术 1.MD5 2.以前是SHA1加密  现在流行是SHA-2加密

  3. ASP&period;NET 4&period;5 和 Visual Studio 2012 中的新功能

    原文地址:http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/whats-new#_Toc318097372

  4. 02&period;Apache FtpServer使用数据库管理用户

    1.创建数据库及表 使用\apache-ftpserver-1.0.6\res\ftp-db.sql建表,内容如下: CREATE TABLE FTP_USER ( userid VARCHAR(64 ...

  5. Linux UGO和ACL权限管理

    自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序.文件.进程)的拥有者可以任意修改或者授予此对象相应的权限.Linux的UGO(User, Grou ...

  6. C&num;整理

    输入输出--数据类型--变量与常量--运算符表达式--语句(顺序.分支.循环)--数组--函数--结构体一.输入与输出.Console.ReadLine();Console.WriteLine();C ...

  7. SQLCODE&equals;-668&comma; SQLSTATE&equals;57016&comma; SQLERRMC&equals;7

    当前表出于 装入暂挂状态,使用重组命令(reorg) 不起作用,报SQL-104, 然后从网上百度了大量解除 DB2暂挂的命令均不好使,最后采用了对表的runstats单个优化,也是类似reorg的单 ...

  8. FFmpeg的H&period;264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  9. Spring Data Elasticsearch 和 x-pack 用户名&sol;密码验证连接

    Elasticsearch Java API 客户端连接 一个是TransportClient,一个是NodeClient,还有一个XPackTransportClient TransportClie ...

  10. 通过源码了解ASP&period;NET MVC 几种Filter的执行过程 在Winform中菜单动态添加&OpenCurlyDoubleQuote;最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...