POJ2115 C-Loop
2024-08-30 19:52:37
这道题是求解不定方程的一道好练习题。
题目描述的很诡异……还说什么k进制,其实就是要求一个数A,每次加C,问到B要加多少次,所有的数对2k取模。
也就是说我们能列出如下方程:A+xC ≡ B (mod 2k)
我们把这个方程两边移项转化,那么就能得到一个不定方程的形式。
老套路,判断有没有解,否则用exgcd求解。
本题有小坑,你在1<<32的时候,即使变量开了longlong也不行,必须写成1ll的形式,否则会WA。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<queue>
#define pb push_back
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int N = ;
const int INF = ;
const ll mod = ; ll read()
{
ll ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} ll a,b,c,k,x,y,p,q,s; ll gcd(ll a,ll b)
{
return (!b) ? a : gcd(b,a%b);
} ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x = ,y = ;
return a;
}
ll d = exgcd(b,a%b,y,x);
y -= a/b * x;
return d;
} int main()
{
while()
{
a = read(),b = read(),c = read(),k = read();
if(!a && !b && !c && !k) break;
p = c,q = 1LL << k,s = (b-a+q) % q;
ll G = gcd(p,q);
if(s % G)
{
printf("FOREVER\n");
continue;
}
p /= G,q /= G,s /= G;
exgcd(p,q,x,y);
x = (x + q) % q,x *= s,x %= q;
printf("%lld\n",x);
}
return ;
}
最新文章
- EntityFramework 事务处理
- 用Fmx调用Bass.dll
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
- 关于onmouseover和onmouseout的bug
- Linux机器24项安全合规设置
- BZOJ2164 : 采矿
- Android照片墙应用实现,再多的图片也不怕崩溃
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
- 在Android设备上判断设备是否支持摄像头
- SlickGrid example 3b: 支持撤销操作的编辑单元
- nginx配置说明
- ANDROID_MARS学习笔记_S03_007_GoogleMap1
- linkedlist,arraylist,vector的特点
- 一次 HTTP 请求响应过程的完整解析
- Oracle工具——ADRCI
- MybatisMapper 映射框架(增删改查 原始模式)
- 12.27 cf div3 解题报告
- 用Jenkins自动化搭建测试环境-前奏
- C语言、编程语言发展史
- CAAnimation临时取消动画,永久取消动画