Odd Country

Description

在一片美丽的大陆上有 $100000$ 个国家,记为 $1$ 到 $100000$。这里经济发达,有数不尽的账房,并且每个国家有一个银行。某大公司的领袖在这 $100000$ 个银行开户时都存了 $3$ 大洋,他惜财如命,因此会不时地派小弟 GFS 清点一些银行的存款或者让 GFS 改变某个银行的存款。该村子在财产上的求和运算等同于我们的乘法运算,也就是说领袖开户时的存款总和为 $3^{100000}$。这里发行的软妹面额是最小的 $60$ 个素数 $(p_1 = 2, p_2 = 3, \dots, p_{60} = 281)$,任何人的财产都只能由这 $60$ 个基本面额表示,即设某个人的财产为 $\text{fortune}$(正整数),则 $\text{fortune} = p_1^{k_1} \cdot p_2^{k_2} \cdot \dots \cdot p_{60}^{k_{60}}$。

领袖习惯将一段编号连续的银行里的存款拿到一个账房去清点,为了避免 GFS 串通账房叛变,所以他不会每次都选择同一个账房。GFS 跟随领袖多年已经摸清了门路,知道领袖选择账房的方式。如果领袖选择清点编号在 $[a, b]$ 内的银行财产,他会先对 $[a, b]$ 的财产求和(计为 $\text{product}$),然后在编号属于 $[1, \text{product}]$ 的账房中选择一个去清点存款,检验自己计算是否正确同时也检验账房与 GFS 是否有勾结。GFS 发现如果某个账房的编号 $\text{number}$ 与 $\text{product}$ 相冲,领袖绝对不会选择这个账房。怎样才算与 $\text{product}$ 不相冲呢?若存在整数 $x,y$ 使得 $\text{number} \cdot x + \text{product} \cdot y = 1$,那么我们称 $\text{number}$ 与 $\text{product}$ 不相冲,即该账房有可能被领袖相中。当领袖又赚大钱了的时候,他会在某个银行改变存款,这样一来相同区间的银行在不同的时候算出来的 $\text{product}$ 可能是不一样的,而且领袖不会在某个银行的存款总数超过 $1000000$。

现在 GFS 预先知道了领袖的清点存款与变动存款的计划,想请你告诉他,每次清点存款时领袖有多少个账房可以供他选择,当然这个值可能非常大,GFS 只想知道对 $19961993$ 取模后的答案。

Input Format

第一行一个整数 $x$ 表示领袖清点和变动存款的总次数。

接下来 $x$ 行,每行 $3$ 个整数 $a_i, b_i, c_i$。$a_i$ 为 $0$ 时表示该条记录是清点计划,领袖会清点 $b_i$ 到 $c_i$ 的银行存款,你需要对该条记录计算出 GFS 想要的答案。$a_i$ 为 $1$ 时表示该条记录是存款变动,你要把银行 $b_i$ 的存款改为 $c_i$,不需要对该记录进行计算。

Output Format

输出若干行,每行一个数,表示那些年的答案。

Sample Input

6
0 1 3
1 1 5
0 1 3
1 1 7
0 1 3
0 2 3

Sample Output

18
24
36
6

Hint

$20\%$ 的数据满足: $x \leq 10000$,当 $a_i = 0$ 时 $0 \leq c_i − b_i \leq 100$; 每个 $\text{product} \leq 10^{18}$;

$30\%$ 的数据满足:$x \leq 50000$,当 $a_i = 0$ 时 $0 \leq c_i − b_i \leq 10000$;

$50\%$ 的数据满足:$x \leq 100000$,当 $a_i = 0$ 时 $0 \leq c_i − b_i \leq 100000$;

以上数据不重合,$20\% +30\% + 50\% = 100\%$,且保证满足题干要求。

分析:
  线段树维护乘积和包含哪些质数(状态压缩),然后欧拉函数做。

代码:

  1 #include <cstdio>
  2 #include <cstring>
  3
  4 #define MOD 19961993ll
  5 #define MID (left + right >> 1)
  6
  7 int f[300], p[100], pn;
  8 int n, q1, q2, q3;
  9
 10 long long prod[400000], has[400000], rev[100], erci[100];
 11
 12 long long tmp, tmphas;
 13
 14 long long pow(long long num, long long mi)
 15 {
 16     if (mi == 0) return 1;
 17     if (mi == 1) return num;
 18     if (mi == 2) return num * num % MOD;
 19     return pow(pow(num, mi / 2), 2) * pow(num, mi % 2) % MOD;
 20 }
 21
 22 void build(int i, int left, int right)
 23 {
 24     has[i] = 2;
 25     if (left != right)
 26     {
 27         build(i << 1, left, MID);
 28         build(i << 1 | 1, MID + 1, right);
 29         prod[i] = prod[i << 1] * prod[i << 1 | 1] % MOD;
 30         return;
 31     }
 32     prod[i] = 3;
 33 }
 34
 35 void modify(int i, int left, int right, int pos, int data)
 36 {
 37     if (left == right)
 38     {
 39         prod[i] = data % MOD;
 40         has[i] = 0;
 41         for (int j = 0; j < 60; j++)
 42         {
 43             if (data % p[j] == 0)
 44             {
 45                 has[i] |= erci[j];
 46             }
 47         }
 48         return;
 49     }
 50     if (pos <= MID)
 51     {
 52         modify(i << 1, left, MID, pos, data);
 53     }
 54     else
 55     {
 56         modify(i << 1 | 1, MID + 1, right, pos, data);
 57     }
 58     prod[i] = prod[i << 1] * prod[i << 1 | 1] % MOD;
 59     has[i] = has[i << 1] | has[i << 1 | 1];
 60 }
 61
 62 void query(int i, int left, int right, int ql, int qr)
 63 {
 64     if (ql <= left && qr >= right)
 65     {
 66         tmp = tmp * prod[i] % MOD;
 67         tmphas |= has[i];
 68         return;
 69     }
 70     if (qr < left || ql > right)
 71     {
 72         return;
 73     }
 74     if (ql <= MID)
 75     {
 76         query(i << 1, left, MID, ql, qr);
 77     }
 78     if (qr > MID)
 79     {
 80         query(i << 1 | 1, MID + 1, right, ql, qr);
 81     }
 82 }
 83
 84 int main()
 85 {
 86     pn = 0;
 87     for (int i = 2; i < 300; i++)
 88     {
 89         if (!f[i])
 90         {
 91             rev[pn] = (i - 1) * pow(i, MOD - 2) % MOD;
 92             erci[pn] = (pn == 0 ? 1 : erci[pn - 1] << 1);
 93             p[pn] = i;
 94             pn++;
 95             for (int j = i + i; j < 300; j += i)
 96             {
 97                 f[j] = i;
 98             }
 99         }
100     }
101     build(1, 1, 100000);
102     scanf("%d", &n);
103     for (int i = 0; i < n; i++)
104     {
105         scanf("%d%d%d", &q1, &q2, &q3);
106         if (q1 == 0)
107         {
108             tmp = 1;
109             tmphas = 0;
110             query(1, 1, 100000, q2, q3);
111             for (int j = 0; j < 60; j++)
112             {
113                 if (tmphas & erci[j])
114                 {
115                     tmp = tmp * rev[j] % MOD;
116                 }
117             }
118             printf("%lld\n", tmp);
119         }
120         else
121         {
122             modify(1, 1, 100000, q2, q3);
123         }
124     }
125 }
时间: 2024-10-10 09:00:42

Odd Country的相关文章

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

[LeetCode]Odd Even Linked List

题目:Odd Even Linked List Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should ru

codeforces 710C C. Magic Odd Square(构造)

题目链接: C. Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd. Input The only line contains odd integer n (1 ≤ n ≤ 49). Output Print n lines with n integers. All the

hdu 5723 Abandoned country 最小生成树+子节点统计

Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3006    Accepted Submission(s): 346 Problem Description An abandoned country has n(n≤100000) villages which are numbered from 1

LeeCode Odd Even Linked List

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should run in O(1) space complexi

leetcode:Odd Even Linked List

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should run in O(1) space complexi

328. Odd Even Linked List

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should run in O(1) space complexi

HDU计算机学院大学生程序设计竞赛(2015’12)The Country List

The Country List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2598    Accepted Submission(s): 615 Problem Description As the 2010 World Expo hosted by Shanghai is coming, CC is very honorable

zoj 3332 Strange Country II

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3332 Description You want to visit a strange country. There are n cities in the country. Cities are numbered from 1 to n. The unique way to trav