R - C Looooops POJ - 2115 (exgcd)
题目大意:很好理解,一个for循环语句,从a开始到b结束,步长是c,模数是pow(2,k)
问,最少循环多少次,才能到达b,如果永远都到不了b,输出FOREVER
题解:其实就是求一个线性方程,cx=b( mod p)。问x最小是多少。
这个线性方程怎么来的呢?从a开始假设我们走了x步,到达了b,则a+cx=b( mod p)将a移到右边可得cx=(b-a)( mod p)。
这个线性方程怎么解呢? 假设cx在取了y次模得到了(b-a),那么cx-py=(b-a),也就是解这个二元一次方程。
很容易想到用EXGCD。然后就是关于x的最小值,计算出x后,只需要去一次模就可以了。
code:
- //#include<bits/stdc++.h>
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- void exgcd(ll a,ll b,ll &x,ll &y){
- if(b==) {
- x=;y=;
- }
- else {
- exgcd(b,a%b,y,x);
- y-=a/b*x;
- }
- }
- int main(){
- ll A,B,C,k;
- while(cin>>A>>B>>C>>k){
- if(A==&&B==&&C==&&k==) break;
- ll p=(ll)<<k;
- ll b=B-A;
- ll c=C;
- if(c==&&A!=B){
- cout<<"FOREVER"<<endl;
- continue ;
- }
- if(b%__gcd(c,p)==){
- ll d=__gcd(c,p);
- b/=d;c/=d;p/=d;
- ll x,y;
- exgcd(c,p,x,y);x=x*b%p;
- cout<<(x+p)%p<<endl;
- }
- else puts("FOREVER");
- }
- return ;
- }
对拓展欧里解决线性问题的总结:
1 类似于:ax+by=c.该方程有解的条件是 c%gcd(a,b)=0,然后a1=a/gcd(a,b),b1=b/gcd(a,b),c1=c/gcd(a,b),将方程转换成了a1x+b1y=c1。然后我们可以根据exgcd求出a1x+b1y=1时的x,然后只需要让x*=c1就是该方程的解,注意,这个解只是其中一个,该方程的通解为x=x+k*b,y=y-k*a。
R - C Looooops POJ - 2115 (exgcd)的更多相关文章
- C Looooops POJ - 2115 (exgcd)
一个编译器之谜:我们被给了一段C++语言风格的循环 for(int i=A;i!=B;i+=C) 内容; 其中所有数都是k位二进制数,即所有数时膜2^k意义下的.我们的目标时球出 内容 被执行了多少次 ...
- D - C Looooops POJ - 2115 欧几里德拓展
题意:就是看看for(; ;)多久停止. 最让我蛋疼的是1L和1LL的区别!让我足足wa了12发! 1L 是long类型的, 1LL为long long类型的! 思路: 这就是欧几里德扩展的标准式子了 ...
- B - C Looooops POJ - 2115 (扩展欧几里得)
题目链接:https://cn.vjudge.net/contest/276376#problem/B 题目大意:for( int i= A ; i != B; i+ = c ),然后给你A,B,C ...
- C Looooops POJ - 2115
数论好题.. 香! 首先我们看到这一题, 题意是 \[a + c * x \equiv b (mod \ \ 2 ^ k) \] 对此式移一下项, 得 \[c * x \equiv b - a (mo ...
- C Looooops POJ - 2115 拓展gcd 有一个定理待补()
补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)
- Day7 - F - C Looooops POJ - 2115
A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != ...
- poj 2115 C Looooops——exgcd模板
题目:http://poj.org/problem?id=2115 exgcd裸题.注意最后各种%b.注意打出正确的exgcd板子.就是别忘了/=g. #include<iostream> ...
- 【题解】POJ 2115 C Looooops (Exgcd)
POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A ...
- POJ 2115 C Looooops(扩展欧几里得应用)
题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...
随机推荐
- github本地提交代码到远程仓库
1.git工作状态: Workspace: 工作区 :等于平时放代码的地方 Index / Stage: 暂存区,临时存放你的改动,它只是一个文件,保存即将提交到文件列表信息 Repository: ...
- Codeforces Add on a Tree
Add on a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- GO语言web框架Gin之完全指南
GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...
- Tensorboard详解(下篇)
间提壶华小厨 1 Tensorflow监控指标可视化 除了GRAPHS栏目外,tensorboard还有IMAGES.AUDIO.SCALARS.HISTOGRAMS.DISTRIBUTIONS.FR ...
- C++ STL 常用容器之 stack
C++ STL Container--Stack 栈是一种先进后出(LIFO)的数据结构,限制只能在一端完成插入和删除操作,这一端叫做栈顶(top),另一端即为栈底(bottom).C++ STL(S ...
- FME中矢量裁剪
- Prism 源码解读6-事件聚合
0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅 ...
- 使用nginx访问FastDFS
文中所有~~~均为同一个自定义文件夹名字,一般使用项目名称 2.1.为什么需要用Nginx访问? FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要 ...
- list容器排除重复单词的程序
#include<iostream> #include<fstream> #include<string> #include<algorithm> #i ...