LuoguP4562 [JXOI2018]游戏 (组合数学)

image

  • 要筛出[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;
}
posted @ 2022-04-29 16:10  qingyanng  阅读(19)  评论(0编辑  收藏  举报