pro: T次询问,每次给出N(N<1e8),求所有Σi^4 (i<=N,且gcd(i,N)==1) ;

sol:  因为N比较小,我们可以求出素因子,然后容斥。  主要问题就是求1到P的4次幂和。  我们知道K次幂和是一个K+1次多项式。

这里有公式Pre=P*(P+1)*(2P+1)*(3P^2+3P-1)/30; 在不知道公式的情况下,我们可以用拉格朗日差值法求。

1,下面给出DFS容斥的代码 。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const ll Mod=1e9+;
int p[maxn],tot,N,T,ans,Rev=;
void init()
{
ll tN=N; tot=; ans=;
for(int i=;i<=tN/i;i++){
if(tN%i==){
p[++tot]=i;
while(tN%i==) tN/=i;
}
}
if(tN>) p[++tot]=tN;
}
int get(ll y)
{
ll res=y*(y+)%Mod;
res=(y*+)%Mod*res%Mod;
res=(y*y%Mod*%Mod+(y*-)%Mod)*res%Mod;
res=res*Rev%Mod;
return res;
return 1LL*y*(y+)%Mod*(y*%Mod+)%Mod*((3LL*y%Mod*y%Mod+y*%Mod-+Mod)%Mod)%Mod*Rev%Mod;
}
void dfs(int pos,int opt,ll sum)
{
if(pos==tot+){
ll t=1LL*sum*sum%Mod*sum%Mod*sum%Mod;
ll x=get(N/sum);
x=x*t%Mod;
if(opt==) ans=(ans+x)%Mod;
else ans=((ans-x)%Mod+Mod)%Mod;
return ;
}
dfs(pos+,opt,sum);
dfs(pos+,-opt,sum*p[pos]);
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&N);
init();
dfs(,,1LL);
printf("%d\n",ans);
}
return ;
}

2,这里的DFS还可以小小的优化一下, 想象一下,DFS的过程是遍历一颗二叉树,那么它遍历了所有的节点, 而且遍历的过程是老老实实一步步走下去的,所以还可以优化一下。   假设不操作则加入左儿子,有操作进入右儿子。 由于每次我遍历到叶子节点才进行计算, 所以很多时候,我向左走其实进行了一些没有价值的访问,会浪费一些时间。

而我现在可以在非叶子节点就进行计算,非叶子节点代表的是一直左走代表的叶子(即用节点代表对应的叶子,减少了不必要的访问)。  这样的话,不会存在浪费。 (虽然在此题中未体现出优劣性,但是去年深圳热身赛有一道搜索题就需要这样才能过。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=1e9+;
int p[maxn],tot,N,T,ans,Rev=;
void init()
{
int tN=N; tot=; ans=;
for(int i=;i*i<=tN;i++){
if(tN%i==){
p[++tot]=i;
while(tN%i==) tN/=i;
}
}
if(tN>) p[++tot]=tN;
}
void dfs(int pos,int opt,int sum) //稍微优化后的DFS
{
int t=1LL*sum*sum%Mod*sum%Mod*sum%Mod;
int y=N/sum;
int x=1LL*y*(y+)%Mod*(y*+)%Mod*(1LL*y*y*%Mod+y*-)%Mod*Rev%Mod;
if(opt==) (ans+=1LL*x*t%Mod)%=Mod;
else ((ans-=1LL*x*t%Mod)+=Mod)%=Mod;
for(int i=pos+;i<=tot;i++){
dfs(i,-opt,sum*p[i]);
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&N);
init();
dfs(,,);
printf("%d\n",ans);
}
return ;
}

3,以及把公式改为拉格朗日差值来求的代码,4次多项式,前缀和为5次多项式,可以通过求前6项来求:(当然这里的拉格朗日还可以优化为O(N),我懒得改了

#include<bits/stdc++.h>
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=1e9+;
int X[maxn]={,,,,,,},Y[maxn]={,,,,,,};
int p[maxn],tot,N,T,ans,Rev=;
int qpow(int a,int x)
{
int res=; while(x){
if(x&) res=1LL*res*a%Mod;
x>>=; a=1LL*a*a%Mod;
}
return res;
}
int Lange(int K)
{
int res=;
rep(i,,) {
int tmp=Y[i];
rep(j,,) {
if(j==i) continue;
tmp=1LL*tmp*(K-X[j])%Mod*qpow(X[i]-X[j],Mod-)%Mod;
tmp=(tmp+Mod)%Mod;
}
(res+=tmp)%=Mod;
}
return res;
}
void init()
{
int tN=N; tot=; ans=;
for(int i=;i*i<=tN;i++){
if(tN%i==){
p[++tot]=i;
while(tN%i==) tN/=i;
}
}
if(tN>) p[++tot]=tN;
}
void dfs(int pos,int opt,int sum) //稍微优化后的DFS
{
int t=1LL*sum*sum%Mod*sum%Mod*sum%Mod;
int y=N/sum;
int x=Lange(y);
if(opt==) (ans+=1LL*x*t%Mod)%=Mod;
else ((ans-=1LL*x*t%Mod)+=Mod)%=Mod;
for(int i=pos+;i<=tot;i++){
dfs(i,-opt,sum*p[i]);
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&N);
init();
dfs(,,);
printf("%d\n",ans);
}
return ;
}

HDU - 4059: The Boss on Mars (容斥 拉格朗日 小小的优化搜索)的更多相关文章

  1. hdu 4059 The Boss on Mars 容斥

    题目链接 求出ai^4+a2^4+......an^4的值, ai为小于n并与n互质的数. 用容斥做, 先求出1^4+2^4+n^4的和的通项公式, 显然是一个5次方程, 然后6个方程6个未知数, 我 ...

  2. 数论 + 容斥 - HDU 4059 The Boss on Mars

    The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若 ...

  3. hdu 4059 The Boss on Mars

    The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU 4059 The Boss on Mars 容斥原理

    The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 4059 The Boss on Mars(容斥原理 + 四次方求和)

    传送门 The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. HDU 4059 The Boss on Mars(容斥原理)

    The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 4059 The Boss on Mars(纳入和排除)

    http://acm.hdu.edu.cn/showproblem.php?pid=4059 定义S = 1^4 + 2^4 + 3^4+.....+n^4.如今减去与n互质的数的4次方.问共降低了多 ...

  8. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  9. hdu 5792(树状数组,容斥) World is Exploding

    hdu 5792 要找的无非就是一个上升的仅有两个的序列和一个下降的仅有两个的序列,按照容斥的思想,肯定就是所有的上升的乘以所有的下降的,然后再减去重复的情况. 先用树状数组求出lx[i](在第 i ...

随机推荐

  1. jquery实现比较靠谱的手风琴代码

    比较靠谱的手风琴代码<pre><!DOCTYPE html><html><head> <meta charset="utf-8" ...

  2. netcore 步骤

    1.创建工程目录 d:\project 2.进入目录,创建解决方案 dotnet new sln 3.确定开发版本 dotnet --list-sdks //列出sdk版本 dotnet new gl ...

  3. Spirng学习指南-第一章(完)

    Spring学习指南 内容提要 ​ Spring框架是以简化J2EE应用程序开发为特定目标而创建的,是当前最流行的Java开发框架. ​ 本书从介绍Spring框架入手,针对Spring4.3和Jav ...

  4. Scratch学习中需要注意的地方,学习Scratch时需要注意的地方

    在所有的编程工具中,Scratch是比较简单的,适合孩子学习锻炼,也是信息学奥赛的常见项目.通常Scratch学习流程是,先掌握程序相关模块,并且了解各个模块的功能使用,然后通过项目的编写和练习,不断 ...

  5. pytest_参数化parametrize

    前言 pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子 import pytest ...

  6. C# 读取Oracle数据库视图数据异常问题处理

    会出现类似现在这种提示的错误 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本 情况1.开发过程中遇到这种问题解决 由于.net ...

  7. C# vb .net实现透视图效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的透视图效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...

  8. 足球foteball运动

    foteball  英语词汇,中文翻译为一种体育项目:足球运动 中文名:运动用的足球 外文名:foteball 目录 释义 foteball 读音:英 [ˈfʊtbɔ:l] 美 [ˈfʊtˌbɔl] ...

  9. maven设定项目编码

    今天在DOS下执行mvn compile命令时报错说缺少必要符号,事实上根本就没有缺少,但何以如此呢,为啥eclipse在编译时就没有这问题呢? 原因是编码的问题造成的! eclipse在编译的使用使 ...

  10. mysql DML 数据插入,删除,更新,回退

    mysql插入,删除,更新地址:https://wenku.baidu.com/view/194645eef121dd36a32d82b1.html http://www.cnblogs.com/st ...