[NOIP模拟2015.10.24]tty的求助III
2015-10-24 14:57
169 查看
题目大意
有一个函数f(x),给定函数在1≤x≤min(n,m)(x>0)内的值。试求出
∏i=1n∏j=1mf(gcd(i,j))
其中1≤n,m≤105,∀1≤x≤min(n,m),1≤f(x)≤5×108。
以为这样就完了吗?
不!
有T次修改操作,每次修改形如(l,r,u)。表示将f(i)(l≤i≤r)的值都乘上u。
每次修改后,要回答上述式子新的值,每次修改影响会持续。
其中1≤u≤5×108,1≤l≤r≤min(n,m)。
最终答案对998244353取模。
题目分析
我们设gk=∑i=1n∑j=1m|gcd(i,j)=k|
然后最初答案就为:
∏i=1min(n,m)f(i)gi
然后考虑修改操作,我们发现其实它对答案的影响只是乘上了
∏i=lrugi
由乘幂运算法则,则等于乘上
u∑ri=lgi
然而我们维护s为g的前缀和即可,利用以上式子算即可。
是不是觉得能过了?是不是有些小激动?
别忘了gk怎么求,还没有分析。
如果n=m,那这个可以很容易在O(n)的时间复杂度内求出。(枚举质因数,用欧拉函数搞一下即可)
但是出题人很恶心,n,m不一定相等。
我们考虑用容斥原理来解决,显然
gi=⌊ni⌋×⌊mi⌋−∑j=2⌊min(n,m)i⌋gi×j
即在[1..n]中选i的倍数,与从[1..m]中选i的倍数组合,减去gcd是i的倍数的个数。
那我们将i从大到小枚举计算即可。
时间复杂度分析:
∑i=1nni=n∑i=1n1n=n(ln(n+1)+γ)
其中γ为欧拉常数。
代码实现
#include <iostream> #include <cstdio> using namespace std; const int N=100000; const int P=998244353; long long f[N+1],g[N+1]; int ans,n,m,t; int readint() { int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } long long readlong() { long long x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int quick_power(long long x,long long y) { if (y==1) return x%P; int ret=quick_power(x,y>>1); ret=(long long)ret*ret%P; if (y&1) ret=(long long)ret*x%P; return ret; } int main() { freopen("help3.in","r",stdin); freopen("help3.out","w",stdout); n=readint(),m=readint(); if (n>m) n^=m^=n^=m; for (int i=1;i<=n;i++) f[i]=readlong(); for (int i=n;i>=1;i--) { g[i]=((long long)n/i)*((long long)m/i); for (int j=2;j<=n/i;j++) g[i]-=g[i*j]; } ans=1; for (int i=1;i<=n;i++) { ans=(long long)ans*quick_power(f[i],g[i])%P; g[i]+=g[i-1]; } printf("%d\n",ans); t=readint(); while (t--) { int l=readint(),r=readint(); long long u=readlong(); ans=(long long)ans*quick_power(u,g[r]-g[l-1])%P; printf("%d\n",ans); } fclose(stdin); fclose(stdout); return 0; }
相关文章推荐
- Android Activity与Service数据交互:Binder、bindService(系列2)
- Ubuntu自带vi不好用的处理办法
- RestFul WCF JSON Service with client and on Mozilla Firefox –REST Client
- 【APUE】Chapter10 Signals
- JavaScript中Date对象的常用方法示例
- 如何在window下编译OpenSSL
- Angular.js学习笔记(三)
- BugPhobia开发篇章:Scurm Meeting-更新至0x02
- IOS开发使用YiRefresh进行刷新
- servlet mysql 入门
- ubuntu 14.04 安装 JDK
- android4.4 动态全局隐藏显示StatusBar
- 《程序员面试金典》--二叉查找树的判断
- 10月21日 学习笔记(3)
- 我学习Object-C中的收获总结(三)(四)
- excel常用的函数
- request.getRequestDispatcher("msg.jsp") .forward(request, response);
- hdu 4417(划分树)
- jQuery的click事件在当前页弹出层窗口(不打开新页面)
- Android 访问WebService的方法