生活随笔
收集整理的這篇文章主要介紹了
守护白起
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近古yu迷上了《戀與制作人》,天天嚷嚷著白起我老公(死gay死gay的),白起又向古yu提出了一個問題:
給你n種卡牌(數量無限),將其擺成長度為m的圓環的方案數。
(如果這個環可以通過若干次旋轉或者反方向讀((abc)(cba)是一樣的),則認為他們是一樣的)
這時古yu一臉茫然,大哭特苦不能守護白起了。古yu希望你能幫助他解決這個問題去守護白起。
輸入描述:
第一行一個t(0<t<=500)
接下來t行,每行倆個正整數n,m(1<=n,m<=10000)
輸出描述:
一個答案加換行(答案可能很大,所以取模1000000007)
示例1
輸入
2
3 4
1 2
輸出
21
1
說明
對于第一個樣例有
21種不同的方法
/ aaaa
/ aaab
/ aaac
/ aabb
/ aabc
/ aacc
/ abab
/
/ abac
/ abbb
/ abbc
/ abcb
/ abcc
/ acac
/ acbc
/
/ accc
/ bbbb
/ bbbc
/ bbcc
/ bcbc
/ bccc
/ cccc
#include <bits/stdc++.h>
#define mod 1000000007
using namespace std
;
int phi
[10005];
bool isp
[10005];
int pri
[10005],cnt
=0;
inline void getp()
{phi
[1]=1;for (int i
=2;i
<=10000;i
++){if (!isp
[i
]) {pri
[++cnt
]=i
;phi
[i
]=i
-1;}for (int j
=1;i
*pri
[j
]<=10000&&j
<=cnt
;j
++){isp
[i
*pri
[j
]]=1;phi
[i
*pri
[j
]]=phi
[i
]*(pri
[j
]-1);if (i
%pri
[j
]==0) {phi
[i
*pri
[j
]]=phi
[i
]*pri
[j
];break;}}}
}
inline int qpow(int a
,int b
)
{int res
=1,tp
=a
;while (b
){if (b
&1) res
=1ll*res
*tp
%mod
;tp
=1ll*tp
*tp
%mod
;b
>>=1;}return res
;
}
int main()
{getp();int test
,n
,m
;scanf
("%d",&test
);while (test
--){scanf
("%d%d",&m
,&n
);int ans
=0;for (int i
=1;i
*i
<=n
;i
++){if (n
%i
==0){ans
+=1ll*phi
[n
/i
]*qpow(m
,i
)%mod
;if (ans
>=mod
) ans
-=mod
;if (i
*i
!=n
){ans
+=1ll*phi
[i
]*qpow(m
,n
/i
)%mod
;if (ans
>=mod
) ans
-=mod
;}}}if (n
&1) {ans
+=1ll*n
*qpow(m
,n
/2+1)%mod
;}else {ans
+=1ll*(n
/2)*(qpow(m
,n
/2)+qpow(m
,n
/2+1))%mod
;}ans
=1ll*ans
*qpow(2*n
,mod
-2)%mod
;printf
("%d\n",ans
);}return 0;
}
總結
以上是生活随笔為你收集整理的守护白起的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。