- 要筛出[l, r]的 ‘质数’个数cnt(这里的质数指的是在区间[l, r]中没有因子的数)
- 枚举贡献:贡献的值域是[cnt, n].
- 对于贡献i 要选一个数放在i上,i-1个位置选cnt-1个放'质数',再乘上质数个数-1的全排列F[cnt - 1],剩余数的全排列 F[len - cnt] ,再乘上贡献i
#include<bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(false) ,cin.tie(0), cout.tie(0);
//#pragma GCC optimize(3,"Ofast","inline")
#define ll long long
#define li __int128_t
//#define int long long
const int N = 1e5 + 5;
const int M = 1e6 + 5;
const int mod = 1e9 + 7;
const ll LNF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
int treel[N], treer[N], n;
int lowbit( int x ) { return x & (- x); }
void updatel(int i) {
for (;i <= n ; i += lowbit(i)) ++ treel[i];
}
void updater(int i) {
for (;i <= n ; i += lowbit(i)) ++ treer[i];
}
int queryl( int i) {
int res = 0;
for (;i ; i -= lowbit(i)) res += treel[i];
return res;
}
int queryr( int i) {
int res = 0;
for (;i ; i -= lowbit(i)) res += treer[i];
return res;
}
int main() {
int m; cin >> n >> m;
while( m -- ) {
int opt, l, r; cin >> opt >> l >> r;
if(opt == 1) {
updatel(l); updater(r);
} else {
cout << queryl(r) - queryr(l - 1) << endl;
}
}
return 0;
}