LuoguP4562 [JXOI2018]游戏 (组合数学)
- 要筛出[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;
}
本文作者:qingyanng
本文链接:https://www.cnblogs.com/muscletear/p/16207025.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步