Description

项链是人体的装饰品之一,是最早出现的首饰。项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架
链和佛教徒的念珠。 从古至今人们为了美化人体本身,也美 化环境,制造了各种不同风格,不同特点、不同式样的项链,满足了不同肤色、不同民族、不同审美观的人的审美需要。就材料而论,首
饰市场上的项链有黄金、白银、珠宝等几种。珍珠项链为珍珠制成的饰品,即将珍珠 钻孔后用线串在一起,佩戴于项间。天然珍珠项链具有一定的护养作用。 
  
最近,铭铭迷恋上了一种项链。与其他珍珠项链基本上相同,不过这种项链的珠子却 与众不同,是正三菱柱的泰山石雕刻而成的。三菱柱的侧面是正方形构成的,上面刻有数字。 能够让铭铭满意的项链必须满足下面的条件: 
1:这串项链由n颗珠子构成的。 
2:每一个珠子上面的数字x,必须满足0<x<=a,且珠子上面的数字的最大公约数要恰 好为1。两个珠子被认为是相同的,当且仅当他们经过旋转,或者翻转后能够变成一样的。 3:相邻的两个珠子必须不同。 
4:两串项链如果能够经过旋转变成一样的,那么这两串项链就是相同的! 铭铭很好奇如果给定n和a,能够找到多少不同串项链。由于答案可能很大,所以对输 出的答案mod 1000000007。

Input

数据由多组数据构成: 
第一行给定一个T<=10,代表由T组数据。 
接下来T行,每行两个数n和a。 
 

Output

对于每组数据输出有多少不同的串。

Sample Input


2 2

Sample Output

3

HINT

对于100%的数据:所有的n<=10^14,a<=10^7,T<=10;

样例解释:由三种珠子:[1,1,1],[1,1,2],[1,2,2].组成的串有:[1,2],[1,3],[2,3]。

Source

Dragonite修正数据 vfleaking加强数据

有一篇超级详细的题解,所以我就不说了

啊涨姿势了学会了7k+的$O(1)$快速乘

  1. inline LL mul(LL x,LL y)
  2. {
  3.   LL tmp=(x*y-(LL)((LD)x/Mod*y+1.0e-8)*Mod);
  4.   return tmp< ? tmp+Mod : tmp;
  5. }

code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define LL long long
  7. #define LD long double
  8. using namespace std;
  9. const LL Maxn = ;
  10. LL Modd = , Mod;
  11. LL n, m;
  12. LL mu[Maxn], pr[Maxn], pl, muu[Maxn], ph[Maxn];
  13. bool v[Maxn], bk;
  14. LL mul ( LL x, LL y ){
  15. if ( bk == true ){
  16. LL ret = , op = ;
  17. if ( x < ){ x = -x; op = -op; }
  18. while (x){
  19. if ( x & ) ret = (ret+y)%Mod;
  20. y = (y<<)%Mod;
  21. x >>= ;
  22. }
  23. return ret*op;
  24. }
  25. else {
  26. LL tmp=(x*y-(LL)((LD)x/Mod*y+1.0e-8)*Mod);
  27. return tmp< ? tmp+Mod : tmp;
  28. }
  29. }
  30. /*inline LL mul(LL x,LL y)
  31. {
  32. LL tmp=(x*y-(LL)((LD)x/Mod*y+1.0e-8)*Mod);
  33. return tmp<0 ? tmp+Mod : tmp;
  34. }*/
  35. void init (){
  36. pl = ;
  37. LL i, j; mu[] = muu[] = ph[] = ;
  38. for ( i = ; i <= ; i ++ ){
  39. if ( v[i] == false ){
  40. pr[++pl] = i;
  41. mu[i] = -;
  42. ph[i] = i-;
  43. }
  44. for ( j = ; j <= pl && i*pr[j] <= ; j ++ ){
  45. v[i*pr[j]] = true;
  46. if ( i % pr[j] == ){ ph[i*pr[j]] = ph[i]*pr[j]; mu[i*pr[j]] = ; break; }
  47. else ph[i*pr[j]] = ph[i]*ph[pr[j]], mu[i*pr[j]] = -mu[i];
  48. }
  49. muu[i] = muu[i-]+mu[i];
  50. }
  51. }
  52. struct matrix {
  53. LL a[][];
  54. LL l1, l2;
  55. void clear (){ memset ( a, , sizeof (a) ); }
  56. }trans, x, fi;
  57. matrix ttimes ( matrix x, matrix y ){
  58. matrix ret;
  59. ret.clear ();
  60. ret.l1 = x.l1; ret.l2 = y.l2;
  61. LL i, j, k;
  62. for ( i = ; i < ret.l1; i ++ ){
  63. for ( j = ; j < ret.l2; j ++ ){
  64. for ( k = ; k < x.l2; k ++ ){
  65. ret.a[i][j] = (ret.a[i][j]+mul(x.a[i][k],y.a[k][j])%Mod)%Mod;
  66. }
  67. }
  68. }
  69. return ret;
  70. }
  71. LL p[Maxn], ppl;
  72. LL phi ( LL x ){
  73. if ( x <= ) return ph[x];
  74. LL ret = x, u = x;
  75. for ( LL i = ; i <= pl; i ++ ){
  76. if ( x % pr[i] == ){
  77. ret = ret/pr[i]*(pr[i]-);
  78. while ( x % pr[i] == ) x /= pr[i];
  79. }
  80. if ( pr[i]*pr[i] > u ) break;
  81. }
  82. if ( x > ) ret = ret/x*(x-);
  83. return ret;
  84. }
  85. LL pow ( LL x, LL k ){
  86. LL ret = ;
  87. while (k){
  88. if ( k & ) ret = mul(ret,x)%Mod;
  89. x = mul(x,x)%Mod;
  90. k >>= ;
  91. }
  92. return ret;
  93. }
  94. int main (){
  95. LL i, j, k, T;
  96. scanf ( "%lld", &T );
  97. init ();
  98. while ( T -- ){
  99. scanf ( "%lld%lld", &n, &m );
  100. if(n== && m==) bk=;
  101. if ( m == ){
  102. printf ( "0\n" );
  103. continue;
  104. }
  105. LL invn, phii;
  106. Mod = Modd;
  107. if ( n % Modd != ) invn = pow ( n, Modd- ), phii = Modd-;
  108. else invn = pow ( n/Modd, Modd- ), Mod = Modd*Modd, phii = Modd*(Modd-);
  109. LL ans2 = , ans3 = ;
  110. LL pos;
  111. for ( i = ; i <= m; i = pos+ ){
  112. LL u = m/i, t; pos = m/(m/i);
  113. t = mul (u,u);
  114. ans2 = (ans2+mul(t,muu[pos]-muu[i-]))%Mod;
  115. t = mul (t,u);
  116. ans3 = (ans3+mul(t,muu[pos]-muu[i-]))%Mod;
  117. }
  118. LL inv = pow ( (LL), phii- );
  119. LL o = mul((ans3+(mul(ans2,(LL)))+)%Mod,inv);
  120. ppl = ; LL sq = sqrt (n);
  121. for ( i = ; i <= sq; i ++ ){
  122. if ( n % i == ) p[++ppl] = i;
  123. }
  124. for ( i = ppl; i >= ; i -- ){
  125. if ( p[i]*p[i] == n ) continue;
  126. p[++ppl] = n/p[i];
  127. }
  128. p[++ppl] = n;
  129. trans.l1 = trans.l2 = ;
  130. trans.a[][] = ; trans.a[][] = o-;
  131. trans.a[][] = ; trans.a[][] = o-;
  132. fi.l1 = ; fi.l2 = ;
  133. fi.a[][] = ; fi.a[][] = mul(o,o-);
  134. LL ans = ;
  135. p[] = ;
  136. for ( i = ; i <= ppl; i ++ ){
  137. x = trans;
  138. for ( j = p[i]-p[i-]; j >= ; j >>= ){
  139. if ( j & ) fi = ttimes ( fi, x );
  140. x = ttimes ( x, x );
  141. }
  142. ans = ( ans + mul(fi.a[][],phi(n/p[i])) ) % Mod;
  143. }
  144. if ( n % Modd == ) ans /= Modd;
  145. printf ( "%lld\n", ((ans*invn)%Modd+Modd)%Modd );
  146. }
  147. return ;
  148. }

bzoj 3202: [Sdoi2013]项链的更多相关文章

  1. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  2. bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...

  3. BZOJ3202 [Sdoi2013]项链

    Problem E: [Sdoi2013]项链 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 427  Solved: 146[Submit][Sta ...

  4. BZOJ 3202 项链

    题目连接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3202 题意:一个项链由n个珠子组成.每个珠子有三个面,每个面上有一个数字,要求每个 ...

  5. bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 参考了博客: https://www.cnblogs.com/zhoushuyu/p/ ...

  6. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

  7. bzoj3202:[Sdoi2013]项链

    思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1.由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设 ...

  8. bzoj 1493: [NOI2007]项链工厂(线段树)

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1256  Solved: 545[Submit][Status] ...

  9. [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】

    题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...

随机推荐

  1. canvas的save与restore方法的作用

    网上搜罗了一堆资料,最后总结一下. save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. restore:用来恢复Canvas之前保存的状态. ...

  2. html页面读取PDF小案例

    html页面 引用<script src="js/pdfobject.js" type="text/javascript" charset="u ...

  3. MySQL日志

    在MySQL中共有4中日志:错误日志.二进制日志.查询日志和慢查询日志 一.错误日志 错误日志名 host_name.err,并默认在参数DATADIR指定的目录中写入日志文件.可使用 --log-e ...

  4. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

  5. 怎样在Windows资源管理器中添加右键菜单以及修改右键菜单顺序

    有时,我们需要在Windows资源管理器的右键菜单中添加一些项,以方便使用某些功能或程序. 比如我的电脑上有一个免安装版的Notepad++,我想在所有文件的右键菜单中添加一项用Notepad++打开 ...

  6. react+redux官方实例TODO从最简单的入门(2)-- 增

    虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...

  7. C++内存管理

    1. 栈(Stack):         位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效.2. 堆(Heap):        由new申请的内存,由delete负责 ...

  8. h5手机页面禁止缩放

    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable= ...

  9. 采用cocos2d-x lua 制作数字滚动效果样例

    require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...

  10. CentOS7 安装中文帮助手册

    1.首先确定系统安装中文字体否 locale 2.rpm安装中文帮助手册 挂在光盘 将man-pages-zh-CN-1.5.2-4.el7.noarch.rpm拷贝到本机 rpm -ivh man- ...