题意翻译

现在存储了一个

2a2b 2^a * 2^b

的矩阵 • 矩阵在内存中是按行存储的 • 现在你想求它的转置 • 唯一允许的操作是交换两个内存位置的值 • 求最少需要的次数? • 4e5 组询问,每组询问 a + b <= 1e6

感谢@IceFox 提供的翻译

题目描述

输入输出格式

输入格式:

First line of input contains number of test cases c (1<=c<=400000). Each test case consists of two integers a,b (0<=a+b<=1000000).

输出格式:

For each test case output minimal number of swaps required to transpose an 2ax2b array. As it can be quite large, you have to output its remainder when divided by 1000003 (yes, it’s a prime number :).

输入输出样例

输入样例#1: 复制

输出样例#1: 复制

观察到我们把这个内存的地址写下来其实是一些数左移了之后产生的数字

然后观察循环节个数 假如循环节个数是K 那么最后的交换次数就是2^(a+b)-k因为每个循环并不需要交换k次而是k-1次即可都交换完 考虑将原来假设为将a+b个珠子串成项链那么方案数怎么求

首先先看一个例子 假设a=3,b=6手动绘图

可以发现我们旋转之后最多转gcd(a,a+b)下 那么循环节长度即为(a+b)/(gcd(a,b))

考虑我们现在将什么重新标号了 这意味着 我们现在附近的点都会融合成一个点

这样得到一个新的项链

一共(a+b)/gcd(a,b)个珠子每个珠子都是可以用2^gcd(a,b) 填充

然后再接着化简公式即可 用常见的套路将Phi与预处理出来 每次只需要算出之后再*phi[i]&phi[n/i]即可

 


elijahqi

辣鸡蒟蒻一枚qwq 欢迎加qq qwq 2922945330

发表评论