fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int maxn = 5e2 + 5;
  7. int dp[maxn][maxn], f[maxn][maxn], g[maxn][maxn];
  8. int p[8] = {2, 3, 5, 7, 11, 13, 17, 19};
  9. array<int, 2> a[maxn];
  10.  
  11. signed main(){
  12. ios_base::sync_with_stdio(false);
  13. cin.tie(0); cout.tie(0);
  14.  
  15. int n, mod; cin >> n >> mod;
  16. for(int i = 1; i <= n - 1; i++){
  17. a[i][0] = -1;
  18. a[i][1] = 0;
  19. int cur = i + 1;
  20. for(int j = 0; j <= 7; j++){
  21. while(cur % p[j] == 0){
  22. cur /= p[j];
  23. a[i][1] |= (1 << j);
  24. }
  25. }
  26. if(cur != 1) a[i][0] = cur;
  27. }
  28. sort(a + 1, a + n);
  29.  
  30. dp[0][0] = 1;
  31. for(int i = 1; i < n; i++){
  32. if(i == 1 || a[i][0] != a[i - 1][0] || a[i][0] == -1){
  33. for(int j = 0; j <= 255; j++) for(int k = 0; k <= 255; k++) f[j][k] = g[j][k] = dp[j][k];
  34. }
  35. for(int j = 255; j >= 0; j--){
  36. for(int k = 255; k >= 0; k--){
  37. if((j & k) == 0){
  38. if((a[i][1] & j) == 0) (g[j][k | a[i][1]] += g[j][k]) %= mod;
  39. if((a[i][1] & k) == 0) (f[j | a[i][1]][k] += f[j][k]) %= mod;
  40. }
  41. }
  42. }
  43. if(i == n - 1 || a[i][0] != a[i + 1][0] || a[i][0] == -1){
  44. for(int j = 0; j <= 255; j++){
  45. for(int k = 0; k <= 255; k++){
  46. if((j & k) == 0) dp[j][k] = (f[j][k] + g[j][k] - dp[j][k] + mod) % mod;
  47. }
  48. }
  49. }
  50. }
  51. int ans = 0;
  52. for(int j = 0; j <= 255; j++){
  53. for(int k = 0; k <= 255; k++){
  54. if((j & k) == 0){
  55. (ans += dp[j][k]) %= mod;
  56. }
  57. }
  58. }
  59. cout << (ans + mod) % mod;
  60. }
  61.  
Success #stdin #stdout 0.01s 8724KB
stdin
Standard input is empty
stdout
3