probleme
小花梨的陣列
時間限制:1000ms
空間限制:512mb
description
小花梨得到了乙個長度為n的陣列a,現在要對它進行三種操作:
⚫1 l r對所有的i∈[l,r],a[i]=a[i]∗minprime(a[i])
⚫2 l r對所有的i∈[l,r],a[i]=a[i]/minprime(a[i])
⚫3x求a[x]的值
minprime(x)= 1 (x=1)
x的最小素因子(x≥2)
現在給出初始陣列a,對其進行m次操作,對於第三種操作輸出結果。
input
第一行輸入兩個正整數n,m,表示陣列的長度以及操作次數(1≤n,m≤100000)
第二行輸入n個正整數表示陣列푎(1≤ai≤1000000)
接下來m行表示m次操作,每行輸入格式為"1 l r"或者"2 l r",或者"3x",對應上述三種操作。1≤l,r,x≤n,l≤r
output
對於第三種操作輸出答案即可,答案對109+7進行取模。
先要求出所有的素因子,然後用線段樹維護的方法求出除法的次數和乘法的次數
對於每一次除法,我們先判斷這個數之前有沒有被乘過 如果被乘過,那麼就抵消一次乘法。
詳細見**
ac**:
#includeusing namespace std;
#define ll long long
const int mod=1e9+7;
const int maxn=1e5+5;
ll k,n,m,mul[maxn<<2],divn[maxn<<2],a[maxn];
vectorf[maxn];
long long noprime[10000005];//表示某乙個數是不是素數
long long prime[10000005];//表示第幾個素數是...
void lln()
}void update(ll l,ll r,ll res,ll l,ll r,ll p)
return;
} pushdown(l,r,res);
ll mid=(l+r)/2;
if(l<=mid) update(l,mid,res<<1,l,r,p);
if(r>mid) update(mid+1,r,res<<1|1,l,r,p);
}void query(ll l,ll r,ll res,ll& mull,ll& divv,ll x)
pushdown(l,r,res);
ll mid=(l+r)/2;
if(x<=mid) query(l,mid,res<<1,mull,divv,x);
else query(mid+1,r,res<<1|1,mull,divv,x);
}ll pow(ll a, ll b, ll m)
return ans;
}int main()
ans=ans*pow(temp,mull,mod)%mod;//在用快速冪 求出乘的次數 乘上ans 可以得出最後的答案
printf("%lld\n",ans);
}} }
return 0;
}
線段樹 小花梨的陣列
題目描述 小花梨得到了乙個長度為n的陣列a,現在要對它進行三種操作 1 l r對所有的i l,r a i a i minprime a i 2 l r對所有的i l,r a i a i minprime a i 3 x 求a x 的值 現在給出初始陣列a,對其進行m次操作,對於第三種操作輸出結果。輸...
小花梨判連通
美登杯 上海市高校大學生程式設計邀請賽 華東理工大學 2019年5月18日 problemc 小花梨判連通 時間限制 2000ms 空間限制 512mb description 小花梨給出n個點,讓k位同學對這n個點任意新增無向邊,構成k張圖。小花梨想知道對於每個點i,存在多少個點j 包括i本身 使...
C 小花梨判連通
題意 給你k張圖,每個圖有點和邊。輸出每個點1 2.n的點在每張圖裡面都聯通的點的個數。思路 染色也行,並查集也行。在k張圖裡面給每個點染色。比如有3個點,4張圖。染色情況如下 點1 1 1 1 1 點2 1 1 2 2 點3 1 1 2 2 將每個點的k個染色情況作為map的key,點2 1 1 ...