1003
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> pri;
#define ll long long
#define mod 998244353
#define maxn 1000001
ll res[maxn];
vector<int> head[maxn];
int check[maxn];
ll num[maxn];
int main(){
memset(check,0,sizeof(check));
for(int i = 2;i < 1000001;i ++){
if(check[i] == 0)
pri.push_back(i);
for(int j = i;j < maxn; j+=i)
check[j] = 1;
}
int t;
ll l,r,k;
cin>>t;
while(t--){
cin>>l>>r>>k;
for(int i = 0;i <= r - l; i++){
res[i] = l+i;
head[i].clear();
num[i] = 1;
}
ll ans = 0;
for(int i = 0;i < pri.size(); i++){
int p = pri[i];
ll be = (l+p-1)/p*p;
while(be <= r){
int x = 0;
while(res[be-l]%p==0){
res[be-l] /= p;
x++;
}
num[be-l] = num[be-l] *(1+k*x) %mod;
be += p;
}
}
for(int i = 0;i <= r - l;i++){
if(res[i] != 1) num[i] = num[i] *(1+k)%mod;
ans += num[i];
ans %= mod;
}
cout<<ans<<endl;
}
}
1004 真题靠运气的乱搞的,跑了3s左右
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
#define maxn 60007
int tree[maxn];
int get(int p){
int s = 0;
while(p > 0){
s += tree[p];
p -= p&(-p);
}
return s;
}
void set(int p,int s){
while(p < maxn){
tree[p] += s;
p += p&(-p);
}
}
int nextt[maxn],pla[maxn];
int num[maxn];
int main(){
int t,n;
cin>>t;
while(t--){
scanf("%d",&n);
for(int i = 1;i <= n; i++){
pla[i] = maxn-1;
scanf("%d",&num[i]);
}
for(int i = n;i > 0; i--){
nextt[i] = pla[num[i]];
pla[num[i]] = i;
}
memset(tree,0,sizeof(tree));
for(int i = 1;i <= n; i++){
if(pla[num[i]] != -1)
set(i,1);
pla[num[i]] = -1;
}
int k = sqrt(n);
long long up = 1,down = 1;
for(int i = 1;i <= n; i++){
int p = i;
for(int j = i + k;;j+=k){
int u = get(p);
if(j > n) j = n;
int ud = get(j) - u;
ud = j - p - ud;
int d = p - i + 1 + ud;
if(up * d > down * u){
for(int q = p+1; q <= j; q++){
d = q - i + 1;
u = get(q);
if(up * d > down * u){
up = u;
down = d;
}
}
}
p = j;
if(j == n) break;
}
set(i,-1);
set(nextt[i],1);
}
printf("%0.8f\n",1.0*up / down);
}
}
/**
100
5
1 2 1 2 3
6
1 2 1 2 1 2
5
1 1 1 1 1
8
1 2 1 2 1 2 1 2
9
3 1 2 1 2 1 2 1 2
*/
09
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
int t,u,n;
cin>>t;
while(t--){
int odd = 0;
cin>>n;
for(int i = 0;i < n; i++){
scanf("%d",&u);
if(u & 1) odd++;
}
if(odd >= n - odd) cout<<"2 1"<<endl;
else cout<<"2 0"<<endl;
}
}
/**
1
.XX...XX.....XX...XX.
X..X....X......X.X..X
X..X....X.X....X.X..X
......XX.....XX...XX.
X..X.X....X....X.X..X
X..X.X.........X.X..X
.XX...XX.....XX...XX.
*/
11
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char map[7][21];
int result[7];
int work(int x,int y){
memset(result,0,sizeof(result));
if(map[x][y+1] == 'X') result[0] = 1;
if(map[x+1][y] == 'X') result[1] = 1;
if(map[x+1][y+3] == 'X') result[2] = 1;
if(map[x+4][y] == 'X') result[3] = 1;
if(map[x+4][y+3] == 'X') result[4] = 1;
if(map[x+3][y+1] == 'X') result[5] = 1;
if(map[x+6][y+1] == 'X') result[6] = 1;
if(result[1]){ //0 4 5 6 8 9
if(result[0] == 0) return 4;
if(result[5] == 0) return 0;
if(result[3] == 0){
if(result[2] == 0) return 5;
return 9;
}
if(result[2] == 0) return 6;
return 8;
}
else { //1 2 3 7
if(result[0] == 0) return 1;
if(result[3] == 1) return 2;
if(result[5] == 1) return 3;
return 7;
}
}
int main(){
int t;
cin>>t;
while(t--){
for(int i = 0;i < 7; i++)
cin>>map[i];
int x;
x = work(0,0);
cout<<x;
x = work(0,5);
cout<<x;
cout<<":";
x = work(0,12);
cout<<x;
x = work(0,17);
cout<<x<<endl;;
}
}
/**
1
.XX...XX.....XX...XX.
X..X....X......X.X..X
X..X....X.X....X.X..X
......XX.....XX...XX.
X..X.X....X....X.X..X
X..X.X.........X.X..X
.XX...XX.....XX...XX.
*/
12
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> pri;
#define ll long long
#define mod 998244353
#define maxn 2001
int a[maxn],b[maxn];
ll up[maxn],down[maxn];
int main(){
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
for(int i = 0;i < n; i++)
scanf("%d",&a[i]);
for(int j = 0;j < m; j++)
scanf("%d",&b[j]);
memset(up,0,sizeof(up));
memset(down,0,sizeof(down));
ll ans = 0;
for(int i = 0;i < n; i++){
ll s = 0; //up
for(int j = 0;j < m; j++){
if(b[j] == a[i]){
up[j] += s + 1;
ans = (ans + s + 1) % mod;
up[j] %= mod;
}
if(b[j] > a[i]){
s += down[j];
s %= mod;
}
}
s = 0;
for(int j = 0;j < m; j++){
if(b[j] == a[i]){
down[j] += s;
down[j] %= mod;
ans = (ans + s) % mod;
}
if(b[j] < a[i]){
s += up[j];
}
}
}
cout<<ans<<endl;
}
}