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

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

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

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

就这样经过几步转化,我求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(矩阵快速幂+循环节)

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

  2. 2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂

    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.2640 Queuing (矩阵快速幂)

    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(kmp最小循环节)

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

随机推荐

  1. cesium编程入门(七)3D Tiles,模型旋转

    cesium编程入门(七)3D Tiles,模型旋转 上一节介绍了3D Tiles模型的位置移动,和贴地的操作,这一节来聊一聊模型的旋转, 参考<WebGl编程指南>的第四章 假设在X轴和 ...

  2. javascript 获取iframe里页面中元素值的方法 关于contentWindow和contentDocumen

    javascript 获取iframe里页面中元素值的方法 IE方法:document.frames['myFrame'].document.getElementById('test').value; ...

  3. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

  4. 当页面滚动到距顶部一定高度时某DIV自动隐藏和显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Python3之 contextlib

    Python中当我们们打开文本时,通常会是用with语句,with语句允许我们非常方便的使用资源,而不必担心资源没有关闭. with open('/path/filename', 'r') as f: ...

  6. 谷歌支付服务端详细讲解(PHP)

    前不久公司拓展海外市场,要接入google支付.刚开始一头雾水,相关的文档实在太少.而且很多东西都需要FQ,不过好在摸索几天后,总算调试通了. 前提:FQ 1.注册账号google账号 https:/ ...

  7. FPGA基础学习(8) --内部结构之存储单元

    目录 1. 基本结构 2. BRAM与DRAM的比较 3. BRAM的特点 4. Block Memory的使用 4.1 配置为RAM或ROM 4.2. 配置为FIFO 参考文献: 上一篇中提到了SL ...

  8. [转] Gitlab 8.x runner安装与配置

    [From]http://muchstudy.com/2018/07/13/Gitlab-8-x-runner%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE ...

  9. Jmeter使用指南----压力测试工具

    来源: https://blog.csdn.net/u012111923/article/details/80705141 https://www.cnblogs.com/st-leslie/p/51 ...

  10. JavaScript 面向对象的程序设计(一)之理解对象属性

    首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在 ...