AC日记——【清华集训2014】奇数国 uoj 38

#38. 【清华集训2014】奇数国

思路:

  题目中的number与product不想冲;

  即为number与product互素;

  所以,求phi(product)即可;

  除一个数等同于在模的意义下乘以一个数的逆元;

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 100005
#define mod 19961993
#define ll long long

struct TreeNodeType {
    ll l,r,mid;

    ll dis1,dis2;
};
struct TreeNodeType tree[maxn<<2];

ll n,m,cntp;

ll bit[61],ans1,ans2,pi_[80],pi[80];

bool if_p[300];

inline void in(ll &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}

ll poww(ll pos)
{
    pos%=mod;
    ll mi=mod-2,res=1;
    while(mi)
    {
        if(mi&1) res=(res*pos)%mod;
        mi>>=1,pos=(pos*pos)%mod;
    }
    return res;
}

void tree_build(ll now,ll l,ll r)
{
    tree[now].l=l,tree[now].r=r;
    if(l==r)
    {
        tree[now].dis1=bit[2],tree[now].dis2=3;
        return ;
    }
    tree[now].mid=l+r>>1;
    tree_build(now<<1,l,tree[now].mid);
    tree_build(now<<1|1,tree[now].mid+1,r);
    tree[now].dis1=tree[now<<1].dis1|tree[now<<1|1].dis1;
    tree[now].dis2=tree[now<<1].dis2*tree[now<<1|1].dis2%mod;
}

void tree_to(ll now,ll to,ll dis1,ll dis2)
{
    if(tree[now].l==tree[now].r)
    {
        tree[now].dis1=dis1,tree[now].dis2=dis2;
        return ;
    }
    if(to<=tree[now].mid) tree_to(now<<1,to,dis1,dis2);
    else tree_to(now<<1|1,to,dis1,dis2);
    tree[now].dis1=tree[now<<1].dis1|tree[now<<1|1].dis1;
    tree[now].dis2=tree[now<<1].dis2*tree[now<<1|1].dis2%mod;
}

void tree_query(ll now,ll l,ll r)
{
    if(tree[now].l==l&&tree[now].r==r)
    {
        ans1|=tree[now].dis1;
        ans2=(ans2*tree[now].dis2)%mod;
        return ;
    }
    if(l>tree[now].mid) tree_query(now<<1|1,l,r);
    else if(r<=tree[now].mid) tree_query(now<<1,l,r);
    else tree_query(now<<1,l,tree[now].mid),tree_query(now<<1|1,tree[now].mid+1,r);
}

int main()
{
    for(ll i=2;i<=281;i++)
    {
        if(!if_p[i]) pi[++cntp]=i;
        for(ll j=1;pi[j]*i<=281&&j<=cntp;j++)
        {
            if_p[i*pi[j]]=true;
            if(i%pi[j]==0) break;
        }
    }
    for(ll i=1;i<=60;i++)
    {
        pi_[i]=poww(pi[i]);
        if(i==1) bit[i]=1;
        else bit[i]=bit[i-1]<<1;
    }
    in(n);tree_build(1,1,maxn-5);
    ll op,ai,bi;
    for(;n--;)
    {
        in(op),in(ai),in(bi);
        if(op==1)
        {
            ll pos=0;
            for(ll i=1;i<=60;i++) if(bi&&(bi%pi[i]==0)) pos+=bit[i];
            bi%=mod;tree_to(1,ai,pos,bi);
        }
        else
        {
            ll ans;ans1=0,ans2=1,tree_query(1,ai,bi),ans=ans2;
            for(ll i=1;i<=60;i++) if(bit[i]&ans1) ans=(ans*((pi[i]-1)*pi_[i]%mod))%mod;
            printf("%lld\n",ans);
        }
    }
    return 0;
}
时间: 2024-08-04 16:04:05

AC日记——【清华集训2014】奇数国 uoj 38的相关文章

[清华集训2014]奇数国

OJ题号:UOJ38.BZOJ3813 题目大意: 一个长度为$1000000$的数列,提供以下两种操作: 1.修改某一点的数: 2.求某一区间乘积的欧拉函数. 保证每个元素的最大质因数不超过$281$,答案对$19961933$取模. 思路: $\varphi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_l})$,其中$p$为$n$的不同的质因数. 可以发现欧拉函数值只与$n$和$p$有关. 所以可以用线段树维护每个区间的乘积,

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,

清华集训2014 做题记录

清华集训2014做题记录 已完成 [清华集训2014]玛里苟斯 [清华集训2014]主旋律 [清华集训2014]奇数国 [清华集训2014]矩阵变换 [清华集训2014]sum [清华集训2014]虫逢 [清华集训2014]玄学 [清华集训2014]文学 未完成 [清华集训2014]卡常数 [清华集训2014]简单回路 [清华集训2014]Router [清华集训2014] Breaking Bomber 写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有四个题没做. [清华集

「清华集训2014」主旋律

「清华集训2014」主旋律 这个题好难难啊,我想了一个小时连50分都不会,只能去摸周指导了. 我们试图直接爆算集合 \(S\) 的非强连通导出子图数量,考虑将这个导出子图的所有强连通分量缩点后,一定是一个点数 \(\geq 2\) 的 \(\text{DAG}\) .即缩完以后至少要有一个入度为 \(0\) 的点,这个条件充分性显然,必要性考虑如果不存在入度为 \(0\) 的点,那么一定存在一个环,说明并没有将所有强连通分量缩掉.然后我们枚举入度为 \(0\) 的点集 \(T\) ,记 \(F(

「清华集训2014」矩阵变换

「清华集训2014」矩阵变换 解题思路 问题转化为找一个行与选的数字的完美匹配,记 \(pos[i][j]\) 为数字 \(i\) 在第 \(j\) 行的出现位置,要求不存在匹配边 \((a,b),(c,d)\) 使得 \(pos[b][a] < pos[b][c]\ \& \ pos[d][c] > pos[b][c]\) . 观察发现,这个式子相当于让一条边的权值看做 \(pos[x][y]\) ,当存在一个行与一个数没有匹配但是强行让它们匹配后数的权值会变大,行的权值会变小,这个

UOJ#46. 【清华集训2014】玄学

传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干块,每块对应序列上不同的区间 于是查询时对于每个线段树上区间查询时二分查找当前点在哪一块中即可 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include&

【UOJ#38】【清华集训2014】奇数国

考虑欧拉函数的性质,60很小,压位存下线段树每个节点出现质数. #include<bits/stdc++.h> const int N=100010; const int yql=19961993; typedef long long ll; using namespace std; int prime[100],n,m,vis[910]; ll val,p,rev[100]; struct Segment_Tree{ #define lson (o<<1) #define rso

线性基 uoj 36 清华集训2014 玛里苟斯

http://uoj.ac/problem/36 感觉挺可做的但是不会.. \(k=1\)按位扫就好了 出现\(1\)概率就是\(0.5\) \(k=2\)要特殊处理 设xor后的数是\(b_1 b_2 \dots b_n\) 计算平方贡献就好了\(\sum_{i,j}b_i b_j 2^{i+j}*p\) \(p\)存在一位\(i\),\(j\)不同的话是1/4 否则就是1/2 \(k\geq3\) 首先要知道随机选数的话 如果维护的集合可以通过xor算子得到\(x\) 那么\(x\)与答案无

[UOJ]#36. 【清华集训2014】玛里苟斯

题目大意:给n个数字,求子集的异或和的k次方的期望(n<=10^5,k<=5,保证答案小于2^63) 做法:首先如果从集合中拿出a和b,把a和a xor b放回集合,子集的异或和与原来是一一对应的,用高斯消元的思想可以消到只剩log个数,其他都是0,对答案没有影响.然后考虑k次方的期望,我们把二进制下每一位拆开,假设第i位的数字为xi,答案为(x1+x2+...+xlog)^k的期望,展开式子后发现是选k次x1~xlog中的数(可以重复选),每种选法选的位的乘积的期望的和,暴力枚举每种选法,复