HDU 5690——All X——————【快速幂 | 循环节】
All X
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 879 Accepted Submission(s): 421
F(x,m) mod k ≡ c
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤1010
0≤c<k≤10,000
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
1 3 5 1
3 5 99 69
No
Case #2:
Yes
Case #3:
Yes
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
#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——————【快速幂 | 循环节】的更多相关文章
- HDU——4291A Short problem(矩阵快速幂+循环节)
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 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 ...
- hdu 4291 矩阵幂 循环节
http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109 ...
- HDU 1061 Rightmost Digit --- 快速幂取模
HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...
- HDU 3977 斐波那契循环节
这类型的题目其实没什么意思..知道怎么做后,就有固定套路了..而且感觉这东西要出的很难的话,有这种方法解常数会比较大吧..所以一般最多套一些比较简单的直接可以暴力求循环节的题目了.. /** @Dat ...
- HDU.2640 Queuing (矩阵快速幂)
HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...
- HDU 5667 构造矩阵快速幂
HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ...
- HDU 6185 Covering 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...
- hdu 3746 Cyclic Nacklace(kmp最小循环节)
Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...
随机推荐
- Visual Studio Error
Visual Studio Error 注意:文中所有“系统”用词,均指Windows Console操作系统IO Debug Error 错误类型 #0表示调用约定错误 可以考虑在指针前面加上_st ...
- IIS应用程序池自动回收作业
vb: appPoolName = WScript.Arguments() Set oWebAdmin = GetObject("winmgmts:root\WebAdministratio ...
- T-SQL逻辑查询
理解T-SQL的逻辑查询顺序是学习SQL Server的基础. T-SQL逻辑执行顺序 (8) SELECT (9) DISTINCT (11) <TOP_specification> ...
- 编写高质量JS代码中
前段时间看了几道关于前端javascript的面试题目,方觉函数调用模式等基础的重要性.于是,下定决心,好好补补基础,即便不能深入语言的内部设计模式,也要对基本面向对象概念有比较深入的理解. 继续上一 ...
- 【程序】必看干货:Photon多人游戏开发教程
PUN介绍 http://vibrantlink.com/ 入门 Photon Unity Networking(首字母缩写PUN)是一个Unity多人游戏插件包.它提供了身份验证选项.匹配,以及快速 ...
- linux LVM 磁盘管理
一.linux LVM 管理及创建步骤 步骤:1.创建pv—2.创建vg—3.将pv加入vg—4.在vg中创建lv—5.将lv分区格式化—6.将lv分区挂载到某个目录使用 1.创建PV [root@z ...
- python2-url编解码
#coding:utf-8import urllibs={"username":"hhh","password":"XXXX&qu ...
- iOS 之NSOperation(一)
一.NSOperation的介绍 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue实现多线程编程 2.实现多线程的具体步骤 1)将需要执行的操作封装到 ...
- Laravel一些常用命令整理
自动创建项目 laravel new || laravel new xxx || composer create-project --prefer-dist laravel/laravel blogc ...
- 对路径访问拒绝,要加上具体filename/c.png
string strPath = Path.Combine(FilePath, DateTime.Now.ToString("yyyy-MM-dd")); if (!Directo ...