Acwing 1301. C 循环 扩展欧几里得算法
发布日期:2021-05-12 17:10:51 浏览次数:14 分类:精选文章

本文共 928 字,大约阅读时间需要 3 分钟。

对于 C 语言的循环语句,形如:

for (variable = A; variable != B; variable += C)

statement;
请问在 k 位存储系统中循环几次才会结束。

若在有限次内结束,则输出循环次数。否则输出死循环。

输入格式

多组数据,每组数据一行四个整数 A,B,C,k。

读入以 0 0 0 0 结束。

输出格式

若在有限次内结束,则输出循环次数。

否则输出 FOREVER。

数据范围

1≤k≤32,
0≤A,B,C<2k
输入样例:

3 3 2 163 7 2 167 3 2 163 4 2 160 0 0 0

输出样例:

0232766FOREVER

这道题很明显就是一个欧几里得算法的一个变形。

在这里插入图片描述
这是算法的一个变形

a + n ∗ c − ( 1 < < k ) ∗ m = b a + n * c- (1 << k ) * m = b a+nc(1<<k)m=b

n ∗ c − ( 1 < < k ) ∗ m = b − a n * c- (1 << k ) * m = b - a nc(1<<k)m=ba
a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
然后使用扩展欧几里得算法,去把 c,(1<<k)作为扩展欧几里得的a和b,然后去求n,m

做这道题的固定套路是对m除以k,然后用类似于求哈希函数一样,最后输出答案

代码如下。

#include
using namespace std;typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(!b) { x=1;y=0; return a; } LL d=exgcd(b,a%b,y,x); y-=a/b*x; return d;}int main(void){ LL a,b,c,k; while(cin>>a>>b>>c>>k,a||b||c||k) { k=(LL)1<
上一篇:AcWing 1225. 正则问题
下一篇:AcWing 1223. 最大比例 指数的最大公约数

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月17日 00时30分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章