神仙题。

第一场月赛的题目我到第二场月赛完了才写【由此可见我是真的菜

题目就是个大模拟加乘显然,幂的话需要将原函数、导函数的函数值用扩展欧拉定理展开 \(log\) 层。时间复杂度 \(O(T |S| \log^2p)\)

因为求导时要对指数减一,你可能会用加 (模数-1) 来实现,并且如果你的扩展欧拉定理写法是小于模数时是正常值,超过模数时用真实值 + 模数代替,就会导致错误,因为正常的快速幂中 \(0^0=1\)

但 \(0^P=0\) \((P≠0)\)

以下不是本人写的程序 是验题人写的

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define MAXN 10005
  10. #define eps 1e-12
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 + c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. const int MOD = 998244353;
  38. char s[MAXN],que[MAXN];
  39. int val[2],tot,phi[MAXN];
  40. vector<pii > sta[2];
  41. bool f[2][MAXN][2];
  42. int eu(int x) {
  43. int t = x;
  44. for(int i = 2 ; i <= x / i ; ++i) {
  45. if(x % i == 0) {
  46. t = t / i * (i - 1);
  47. while(x % i == 0) x /= i;
  48. }
  49. }
  50. if(x > 1) t = t / x * (x - 1);
  51. return t;
  52. }
  53. int fpow(int x,int c,int mod,bool &on) {
  54. int64 res = 1,t = x;
  55. if(c == 0) {on = 0;return 1;}
  56. if(x == 1 || x == 0) return x;
  57. while(c && !on) {
  58. res = res * x;--c;
  59. if(res >= MOD) {res %= mod;on = 1;break;}
  60. }
  61. while(c) {
  62. if(c & 1) res = res * t % mod;
  63. t = t * t % mod;
  64. c >>= 1;
  65. }
  66. return res;
  67. }
  68. void Solve() {
  69. scanf("%s",s + 2);
  70. read(val[0]);read(val[1]);
  71. s[1] = '(';
  72. int L = strlen(s + 1);
  73. s[L + 1] = ')';++L;
  74. sta[0].clear();sta[1].clear();
  75. tot = 0;
  76. int lev = 0;
  77. for(int i = 1 ; i <= L ; ++i) {
  78. if(s[i] >= '0' && s[i] <= '9') {
  79. if(s[i - 1] < '0' || s[i - 1] > '9') {
  80. for(int k = 0 ; k <= 1 ; ++k) {
  81. int v = s[i] - '0';
  82. sta[k].pb(mp(v,(lev == 0 ? 0 : v)));
  83. f[k][sta[k].size() - 1][0] = 0;
  84. f[k][sta[k].size() - 1][1] = 0;
  85. }
  86. }
  87. else {
  88. for(int k = 0 ; k <= 1 ; ++k) {
  89. auto t = sta[k].back();
  90. int64 a = 1LL * t.fi * 10 + s[i] - '0';
  91. int64 b = 1LL * t.se * 10 + s[i] - '0';
  92. if(a >= MOD) {
  93. f[k][sta[k].size() - 1][0] = 1;
  94. a %= phi[lev];
  95. }
  96. if(b >= MOD) {
  97. f[k][sta[k].size() - 1][1] = 1;
  98. b %= phi[max(lev - 1,0)];
  99. }
  100. if(lev == 0) b = 0;
  101. t = mp(a,b);
  102. sta[k].pop_back();sta[k].push_back(t);
  103. }
  104. }
  105. }
  106. else if(s[i] == ')') {
  107. if(!tot) break;
  108. if(que[tot] == '^') --lev;
  109. for(int k = 0 ; k <= 1 ; ++k) {
  110. int si = sta[k].size() - 1;
  111. auto t0 = sta[k][si - 1],t1 = sta[k][si];
  112. sta[k].pop_back();sta[k].pop_back();
  113. if(que[tot] == '^') {
  114. if(f[k][si][0]) t1.fi += phi[lev + 1];
  115. if(f[k][si][1]) t1.se += phi[lev];
  116. if(lev) {
  117. int a = fpow(t0.fi,t1.fi,phi[lev],f[k][si - 1][0]);
  118. int b = fpow(t0.se,t1.se,phi[lev - 1],f[k][si - 1][1]);
  119. sta[k].pb(mp(a,b));
  120. }
  121. else {
  122. int a = fpow(t0.fi,t1.fi,MOD,f[k][si - 1][0]);
  123. int b = 1LL * t1.se * t0.se % MOD;
  124. if(t0.fi != 0)
  125. b = 1LL * b * fpow(t0.fi,(1LL * t1.fi + (MOD - 2)) % (MOD - 1),MOD,f[k][si - 1][1]) % MOD;
  126. else {
  127. if(f[k][si][0]) b = 0;
  128. else if(t1.fi - 1) b = 0;
  129. }
  130. sta[k].pb(mp(a,b));
  131. }
  132. }
  133. else if(que[tot] == '+') {
  134. f[k][si - 1][0] |= f[k][si][0];
  135. f[k][si - 1][1] |= f[k][si][1];
  136. t0.fi = t0.fi + t1.fi;
  137. t0.se = t0.se + t1.se;
  138. if(t0.fi >= MOD) {t0.fi %= phi[lev];f[k][si - 1][0] |= 1;}
  139. if(t0.se >= MOD) {t0.se %= phi[max(0,lev - 1)];f[k][si - 1][1] |= 1;}
  140. sta[k].pb(t0);
  141. }
  142. else if(que[tot] == '*') {
  143. if(lev == 0) {
  144. int64 a = 1LL * t0.fi * t1.fi % MOD;
  145. int64 b = (1LL * t0.fi * t1.se % MOD + 1LL * t1.fi * t0.se % MOD) % MOD;
  146. sta[k].pb(mp((int)a,(int)b));
  147. }
  148. else {
  149. if((!f[k][si][0] && t1.fi == 0) || (!f[k][si - 1][0] && t0.fi == 0)) f[k][si - 1][0] = 0;
  150. else f[k][si - 1][0] |= f[k][si][0];
  151. if((!f[k][si][1] && t1.fi == 0) || (!f[k][si - 1][1] && t0.fi == 0)) f[k][si - 1][1] = 0;
  152. else f[k][si - 1][1] |= f[k][si][1];
  153. int64 a = 1LL * t0.fi * t1.fi;
  154. int64 b = 1LL * t0.se * t1.se;
  155. if(a >= MOD) {a %= phi[lev];f[k][si - 1][0] |= 1;}
  156. if(b >= MOD) {b %= phi[lev - 1];f[k][si - 1][1] |= 1;}
  157. sta[k].pb(mp((int)a,(int)b));
  158. }
  159. }
  160. }
  161. --tot;
  162. }
  163. else if(s[i] == 'x') {
  164. sta[0].pb(mp(val[0],1));
  165. sta[1].pb(mp(val[1],1));
  166. }
  167. else {
  168. if(s[i] != '(') que[++tot] = s[i];
  169. if(s[i] == '^') ++lev;
  170. }
  171. }
  172. out(sta[0][0].se);space;out(sta[1][0].se);enter;
  173. }
  174. int main() {
  175. #ifdef ivorysi
  176. freopen("f2.in","r",stdin);
  177. #endif
  178. int T;
  179. read(T);
  180. phi[0] = MOD;
  181. for(int i = 1 ; i <= 10000 ; ++i) {
  182. phi[i] = eu(phi[i - 1]);
  183. }
  184. for(int i = 1 ; i <= T ; ++i) {
  185. Solve();
  186. }
  187. }

随机推荐

  1. MySQL Connector/Python 接口 (二)

    连接数据库 本文参见这里,示例如何连接MySQL 数据库. import mysql.connector from mysql.connector import errorcode # 连接数据库需要 ...

  2. JavaSE 学习笔记之Jdk5.0新特性(十九)

    Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...

  3. [luoguP1631] 序列合并(堆 || 优先队列)

    传送门 首先,把A和B两个序列分别从小到大排序,变成两个有序队列.这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] <= A[1]+B[ ...

  4. sql自增长和占位符?"相矛盾"的问题

    1.对于sql server数据当数据被定义为自增长时,插入,无法将那个位置用字符占位,我们可以使用部分插入的方法来做.  insert into users (username,email,grad ...

  5. ms sql SERVER 下载

    企业版DVD SQL Server 2005 Enterprise Edition(支持超大型企业) 32 位DVD: ed2k://|file|cs_sql_2005_ent_x86_dvd.iso ...

  6. linux 卸载php mysql apache

    卸载Mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的包: mysql-3.23.58-9php-mysql-4.3.4-11mod_a ...

  7. Entity Framework性能影响因素分析

    1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...

  8. 启动第二个Activity

    启动第二个Activity activity_main.xml文件: <? xml version="1.0" encoding="utf-8"?> ...

  9. CentOS 7下安装Hadoop2.2

    这里就介绍CentOS的安装了,直接进入Hadoop2.2伪分布模式安装. 1.安装包下载 1.1.下载JDK1.7 眼下JDK的版本号是jdk1.8.0_25.这里下载的是jdk1.7.0_67. ...

  10. 从基于 SQL 的 CURD 操作转移到基于语义 Web 的 CURD 操作

    中文名称 CURD 含义 数据库技术中的缩写词 操作对象 一般的项目开发的各种参数 作用 用于处理数据的基本原子操作     它代表创建(Create).更新(Update).读取(Retrieve) ...