# ã¯ã©ã¹ ModIntFactory, ModIntFactory$ModInt - - - å°ä½æ¼ç®ããµãã¼ãããã¯ã©ã¹ã§ã. ## ä½¿ãæ¹ 1. `ModIntFactory` ã®ã¤ã³ã¹ã¿ã³ã¹ (ModInt ã®ãã¡ã¯ããª) ãçæ 2. çæãã Factory ãã `ModIntFactory$ModInt` ãçæ ```java public static void main(String[] args) { // ModIntFactory ã®ã¤ã³ã¹ã¿ã³ã¹ãçæ (ããã§ mod ãè¨å®ãã) ModIntFactory factory = new ModIntFactory(998244353); // ModIntFactory ãç¨ã㦠ModInt ãçæãã ModIntFactory.ModInt n = factory.create(10000); ModIntFactory.ModInt m = factory.create(100000); // (n * m) % mod ãè¨ç® ModIntFactory.ModInt k = n.mul(m); // value() ã¡ã½ããã«ããå¤ãåå¾ãã int kVal = k.value(); } ``` `Java 11` ã使ããã¨ã®åºæ¥ãç°å¢ã§ã¯ï¼ä»¥ä¸ã®ããã«ç°¡æ½ã«æ¸ããã¨ãåºæ¥ã¾ã. ```java public static void main(String[] args) { var factory = new ModIntFactory(998244353); var n = factory.create(10000); var m = factory.create(100000); var k = n.mul(m); int kVal = k.value(); } ``` ## ã³ã³ã¹ãã©ã¯ã¿ ### ModIntFactory ```java public ModIntFactory(int mod) ``` `ModInt` ãçæãããã¡ã¯ããªãçæãã¾ã. è¨ç®é: $O(1)$ ### ModIntFactory$ModInt å¤é¨ããã³ã³ã¹ãã©ã¯ã¿ãå¼ã¶ãã¨ã¯åºæ¥ã¾ãã. (å¼ã°ãªãã§ä¸ãã) ## ã¡ã½ãã ### ModIntFactory ```java public ModInt create(long value) ``` å¤ `value % mod` ãæã¤ `ModInt` ãçæãã¾ã. è¨ç®é: $O(1)$ ### ModIntFactory$ModInt #### mod ```java public int mod() ``` `mod` ãè¿ãã¾ãï¼ è¨ç®é: $O(1)$ #### value ```java public int value() ``` ä¿æãã¦ããå¤ãè¿ãã¾ãï¼__注æ: `ModInt` ã®ãã£ã¼ã«ã `int value` ã«ç´æ¥ã¢ã¯ã»ã¹ããªãã§ä¸ãã. æ£ããå¤ãåå¾ã§ããªãå¯è½æ§ãããã¾ã.__ è¨ç®é: $O(1)$ #### add ```java // (1) public ModInt add(ModInt mi) // (2) public ModInt add(ModInt mi1, ModInt mi2) // (3) public ModInt add(ModInt mi1, ModInt mi2, ModInt mi3) // (4) public ModInt add(ModInt mi1, ModInt mi2, ModInt mi3, ModInt mi4) // (5) public ModInt add(ModInt mi1, ModInt... mis) // (6) public ModInt add(long mi) ``` 1. å¤ `(a + b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 2. å¤ `(a + b + c) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 3. å¤ `(a + b + c + d) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 4. å¤ `(a + b + c + d + e) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 5. å¤ `(a + b + c + d + e + f + ...) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 6. å¤ `(a + b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 宿°ã®å ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: - (1)~(4), (6): $O(1)$ - (5): $n$ ãå¯å¤é·å¼æ°ã®é·ãã¨ãã¦ï¼$O(n)$ #### sub ```java // (1) public ModInt sub(ModInt mi) // (2) public ModInt sub(long mi) ``` 1. å¤ `(a - b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 2. å¤ `(a - b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 宿°ã®æ¸ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: $O(1)$ #### mul ```java // (1) public ModInt mul(ModInt mi) // (2) public ModInt mul(ModInt mi1, ModInt mi2) // (3) public ModInt mul(ModInt mi1, ModInt mi2, ModInt mi3) // (4) public ModInt mul(ModInt mi1, ModInt mi2, ModInt mi3, ModInt mi4) // (5) public ModInt mul(ModInt mi1, ModInt... mis) // (6) public ModInt mul(long mi) ``` 1. å¤ `(a * b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 2. å¤ `(a * b * c) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 3. å¤ `(a * b * c * d) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 4. å¤ `(a * b * c * d * e) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 5. å¤ `(a * b * c * d * e * f * ...) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 6. å¤ `(a * b) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 宿°ã®ä¹ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: - (1)~(4), (6): $O(1)$ - (5): $n$ ãå¯å¤é·å¼æ°ã®é·ãã¨ãã¦ï¼$O(n)$ #### div ```java // (1) public ModInt div(ModInt mi) // (2) public ModInt div(long mi) ``` 1. å¤ `(a * b^(-1)) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. ãã ãï¼`b^(-1)` 㯠`(b * x) % mod = 1` ãæºãã `x` ã§ã. 2. å¤ `(a * b^(-1)) % mod` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã. 宿°ã®é¤ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: $O(\log \mod)$ å¶ç´ - `gcd(b, mod) = 1` #### inv ```java public ModInt inv() ``` `ModInt a` ã«å¯¾ãã¦, `(a * x) % mod = 1` ãæºããå¤ `x` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã (`a` ã®å¤ã¯æ¸ãæããã¾ãã). è¨ç®é: $O(\log \rm{mod})$ å¶ç´ - `gcd(a, mod) = 1` #### pow ```java public ModInt pow(long n) ``` `(a ^ n) % mod` ãæºããå¤ `x` ãæã¤ `ModInt` ãæ°ãã«çæãã¾ã (`a` ã®å¤ã¯æ¸ãæããã¾ãã). è¨ç®é: $O(\log n)$ #### addAsg ```java // (1) public ModInt addAsg(ModInt mi) // (2) public ModInt addAsg(ModInt mi1, ModInt mi2) // (3) public ModInt addAsg(ModInt mi1, ModInt mi2, ModInt mi3) // (4) public ModInt addAsg(ModInt mi1, ModInt mi2, ModInt mi3, ModInt mi4) // (5) public ModInt addAsg(ModInt... mis) // (6) public ModInt addAsg(long mi) ``` 1. `a += b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 2. `a += b + c` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 3. `a += b + c + d` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 4. `a += b + c + d + e` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 5. `a += b + c + d + e + f + ...` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 6. `a += b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 宿°ã®å ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: - (1)~(4), (6): $O(1)$ - (5): $n$ ãå¯å¤é·å¼æ°ã®é·ãã¨ãã¦ï¼$O(n)$ #### subAsg ```java // (1) public ModInt subAsg(ModInt mi) // (2) public ModInt subAsg(long mi) ``` 1. `a -= b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 2. `a -= b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 宿°ã®æ¸ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: $O(1)$ #### mulAsg ```java // (1) public ModInt mulAsg(ModInt mi) // (2) public ModInt mulAsg(ModInt mi1, ModInt mi2) // (3) public ModInt mulAsg(ModInt mi1, ModInt mi2, ModInt mi3) // (4) public ModInt mulAsg(ModInt mi1, ModInt mi2, ModInt mi3, ModInt mi4) // (5) public ModInt mulAsg(ModInt... mis) // (6) public ModInt mulAsg(long mi) ``` 1. `a *= b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 2. `a *= b * c` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 3. `a *= b * c * d` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 4. `a *= b * c * d * e` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 5. `a *= b * c * d * e * f * ...` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 6. `a *= b` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 宿°ã®ä¹ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: - (1)~(4), (6): $O(1)$ - (5): $n$ ãå¯å¤é·å¼æ°ã®é·ãã¨ãã¦ï¼$O(n)$ #### divAsg ```java // (1) public ModInt divAsg(ModInt mi) // (2) public ModInt divAsg(long mi) ``` 1. `a *= b^(-1)` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. ãã ãï¼`b^(-1)` 㯠`(b * x) % mod = 1` ãæºãã `x` ã§ã. 2. `a *= b^(-1)` ãè¡ãã¾ã. `a` ã®å¤ã¯æ¸ãæãããã¾ã. 宿°ã®é¤ç®ã§ãããç¨ããã¨ä¾¿å©ã§ã. è¨ç®é: $O(\log \mod)$ å¶ç´ - `gcd(b, mod) = 1`