1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <cstring>
  7. #define inf 2147483647
  8. #define P 998244353
  9. #define p(a) putchar(a)
  10. #define For(i,a,b) for(long long i=a;i<=b;++i)
  11.  
  12. using namespace std;
  13. long long T;
  14. long long n,a,b,c;
  15. long long i2 = , i6 = ;//这是2,6在%P意义下的逆元
  16. struct data{
  17. long long f,g,h;
  18. data calc(long long n,long long a,long long b,long long c){
  19. long long ac = a / c, bc = b / c, m = (a * n + b) / c, n1 = n + , n21 = n * + ;
  20. data d;
  21. if (a == ) {
  22. d.f = bc * n1 % P;
  23. d.g = bc * n % P * n1 % P * i2 % P;
  24. d.h = bc * bc % P * n1 % P;
  25. return d;
  26. }
  27.  
  28. if (a >= c || b >= c){
  29. d.f = n * n1 % P * i2 % P * ac % P + bc * n1 % P;
  30. d.g = ac * n % P * n1 % P * n21 % P * i6 % P + bc * n % P * n1 % P * i2 % P;
  31. d.h = ac * ac % P * n % P * n1 % P * n21 % P * i6 % P +
  32. bc * bc % P * n1 % P + ac * bc % P * n % P * n1 % P;
  33. d.f %= P, d.g %= P, d.h %= P;
  34.  
  35. data e = calc(n, a % c, b % c, c);
  36.  
  37. d.h += e.h + * bc % P * e.f % P + * ac % P * e.g % P;
  38. d.g += e.g, d.f += e.f;
  39. d.f %= P, d.g %= P, d.h %= P;
  40. return d;
  41. }
  42.  
  43. data e = calc(m - , c, c - b - , a);
  44. d.f = n * m % P - e.f, d.f = (d.f % P + P) % P;
  45. d.g = m * n % P * n1 % P - e.h - e.f, d.g = (d.g * i2 % P + P) % P;
  46. d.h = n * m % P * (m + ) % P - * e.g - * e.f - d.f;
  47. d.h = (d.h % P + P) % P;
  48. return d;
  49. }
  50. }ans;
  51.  
  52. void in(long long &x){
  53. long long y=;char c=getchar();x=;
  54. while(c<''||c>''){if(c=='-')y=-;c=getchar();}
  55. while(c<=''&&c>=''){ x=(x<<)+(x<<)+c-'';c=getchar();}
  56. x*=y;
  57. }
  58. void o(long long x){
  59. if(x<){p('-');x=-x;}
  60. if(x>)o(x/);
  61. p(x%+'');
  62. }
  63.  
  64. signed main(){
  65. in(T);
  66. while(T--){
  67. in(n);in(a);in(b);in(c);
  68. ans=ans.calc(n,a,b,c);
  69. o(ans.f);p(' ');o(ans.h);p(' ');o(ans.g);p('\n');
  70. }
  71. return ;
  72. }

类欧几里德算法(洛谷 P5170的更多相关文章

  1. Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)

    先套用一个线段树维护离散化之后的区间的每一段的答案 那么只要考虑怎么下面的东西即可 \[\sum_{i=1}^{n}(A\times i \ mod \ B)\] 拆开就是 \[\sum_{i=1}^ ...

  2. 差分约束算法————洛谷P4878 [USACO05DEC] 布局

    题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...

  3. 洛谷P5170 【模板】类欧几里得算法(数论)

    传送门 此题剧毒,公式恐惧症患者请直接转去代码→_→ 前置芝士 基本数论芝士 题解 本题就是要我们求三个函数的值 \[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac ...

  4. UOJ#42. 【清华集训2014】Sum 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...

  5. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  6. BZOJ2987:Earthquake(类欧几里德算法)

    Sol 设 \(n=\lfloor\frac{c}{a}\rfloor\) 问题转化为求 \[\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i= ...

  7. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  8. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  9. 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码

    洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...

随机推荐

  1. ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别

    1:QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便需要提一下的是,QueryTask进行查询的地图服务并 不必项加载到Map中进行显示.Query ...

  2. RTC, Real Time Clock

    配置 写入RTC_PRL, RTC_CNT, RTC_ALR寄存器时,需要先进入配置模式,通过把RTC_CRL寄存器的CNF位置一. 另外,在每次配置一个寄存器时必须等待上一次配置完成,可以通过检测R ...

  3. 剑指offer——33分行从上到下打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...

  4. numpy基本函数

    在学习python的时候常常需要numpy这个库,每次都是用一个查一个,这个,终于见到一个完整的总结了http://blog.csdn.net/blog_empire/article/details/ ...

  5. go 数据类型和操作符

    文件名&关键字&标识符 1. 所有go源码以 .go结尾 2. 标识符以字母或者下划线开头,大小写敏感:add, Add, _add _是特殊标识符,用来忽略结果 3. 保留关键字 G ...

  6. java oop第09章_JDBC02(CRUD操作)

    第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应 ...

  7. JS对象 向下取整floor() floor() 方法可对一个数进行向下取整。 语法: Math.floor(x)

    向下取整floor() floor() 方法可对一个数进行向下取整. 语法: Math.floor(x) 参数说明: 注意:返回的是小于或等于x,并且与 x 最接近的整数. 我们将在不同的数字上使用 ...

  8. Windows服务调试状态下用Console启动

    最近一直在用服务,发现服务也没有那么难调试. Windows服务调试状态下用Console启动:步骤分两步 第一步改Program,启动代码 static class Program { /// &l ...

  9. STL之__ type_traits

    __type_traits:双底线是说明这是SGI STL内部使用的东西,不在STL标准范围之内.iterator_traits负责萃取迭代器(iterator)的特性.而__type_traits则 ...

  10. [190308]Ubuntu 安装完之后,安装的软件小记

    install software vim sudo apt-get install -y vim Typora command copy from Typora website # or run: # ...