1. 程式人生 > >2016"百度之星" - 初賽(Astar Round2A)--HDU 5690 |數學轉化+快速冪

2016"百度之星" - 初賽(Astar Round2A)--HDU 5690 |數學轉化+快速冪

分享 otto lld 方法 can a* sca uic left

技術分享

Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint 對於第一組測試數據:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二組測試數據中滿足如上公式,所以答案是 “Yes”。 解: m個x組成的數可以表示為x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9; 即x*(10^m-1)/9%k==c x*(10^m-1)%(9*k)==9*c? 那麽我們就是要求x*(10^m-1)/9 MOD k是不是==c那麽,這裏有一個分母我們怎麽處理呢,肯定有人在想求逆元呀,但是 GCD(9,k)不一定等於1呀,所以求逆元的方法不能用了,那麽怎麽辦呢,我們可以同時擴大9倍也就是求的 x * (10^m-1)MOD 9k 是不是等於 9 * c,剩下的就是
快速冪了。
#include "
cstdio" #define LL long long LL quick_mod(LL a,LL b,LL mod) { LL ans=1; while(b>0) { if(b&1){ ans=ans*a%mod; } a=a*a%mod; b>>=1; } return ans; } int main() { LL T,x,m,k,c; scanf("%lld",&T); int con=1; while
(T--) { scanf("%lld%lld%lld%lld",&x,&m,&k,&c); printf("Case #%d:\n",con++); LL mod=9*k; LL ans=quick_mod(10,m,mod)*x%mod-x; if(ans==9*c) printf("Yes\n"); else printf("No\n"); } return 0; }

2016"百度之星" - 初賽(Astar Round2A)--HDU 5690 |數學轉化+快速冪