首页 > 其他分享 >Project Euler 457 题解

Project Euler 457 题解

时间:2024-10-15 20:46:33浏览次数:6  
标签:qp return int 题解 Project comp x1 Euler mod

初等数论小题目

\[n^2-3n-1\equiv 0\pmod {p^2} \]

配方,得到:

\[(2n-3)^2\equiv 13 \pmod {p^2} \]

根据亨泽尔引理,只需得到 \((2n-3)^2\equiv 13 \pmod {p}\) 的解即可提升到 \(p^2\)。这是二次剩余,直接解。

单次求解 \(O(\log n)\),时间复杂度 \(O(n)\)。

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace Cp{
	int mod,I;
	struct comp{
		int x,y;
		comp(int a=0,int b=0){
			x=a,y=b;
		}
	};
	bool operator ==(comp a,comp b){
		return a.x==b.x&&a.y==b.y;
	}
	comp operator *(comp a,comp b){
		return comp((a.x*b.x+I*a.y%mod*b.y)%mod,(a.x*b.y+a.y*b.x)%mod);
	}
	comp qp(comp a,int b){
		if(b==0)return comp(1);
		comp T=qp(a,b>>1);T=T*T;
		if(b&1)return T*a;
		return T;
	}
	bool ck(int x){
		return qp(x,(mod-1)/2)==comp(1,0);
	}
	mt19937 rng(time(0));
	void solve(int n,int p,int &x1,int &x2){
		int a=rng()%mod;
		while(!a||ck((a*a+mod-n)%mod))a=rng()%mod;
		I=(a*a+mod-n)%mod;
		x1=(qp(comp(a,1),(mod+1)>>1).x)%mod;
		x2=mod-x1;
	}
	pair<int,int> solve(int N,int P){
		mod=P;
		if(!ck(N))return {-1,-1};
		int x1,x2;solve(N,P,x1,x2);
		return {x1,x2};
	}
}
int baoli(int p){
	int mod=p*p;
	for(int i=0;i<p*p;i++)if((i*i-3*i+3*mod)%mod==1)return i;
	return 0;
}
int qp(int a,int b,int p){
	if(b==0)return 1;
	int T=qp(a,b>>1,p);T=T*T%p;
	if(b&1)return T*a%p;
	return T;
}
int hez(int x,int p){
	int M=p*p;
	if((8*x-12%p+p)%p!=0){
		int t=-qp((8*x-12%p+p)%p,p-2,p)*(((4*x*x-12*x-4))/p)%p;
		t=(t%p+p)%p;
		return t*p+x;
	}else if((4*x*x%M-12*x%M+9+M)%M==13)return x;
	return p*p;
}
int calc(int p){
	if(p==2)return 0;
	auto [a,b]=Cp::solve(13,p);
	if(a==-1)return 0;
	int I2=qp(2,p-2,p);a=(a+3)*I2%p,b=(b+3)*I2%p;
	int res=min(hez(a,p),hez(b,p));
	if(res>=p*p)return 0;
	return res;
}
const int maxn=1e7+5;
bool isp[maxn];
vector<signed> pr;int ans=0;
signed n;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=2;i<=n;i++){
		if(!isp[i])ans+=calc(i),pr.push_back(i);
		for(auto u:pr){
			if(i*u>n)break;
			isp[i*u]=1;
			if(i%u==0)break;
		}
	}
	cout<<ans<<endl;
	
	return 0;
}

标签:qp,return,int,题解,Project,comp,x1,Euler,mod
From: https://www.cnblogs.com/british-union/p/18468395

相关文章

  • TopCoder SRM616 ColorfulCoins 题解
    TopCoderSRM616ColorfulCoins题意给一套货币,保证任意两种货币存在倍数关系且颜色互不相同。已知货币的币值集合,每次可以询问一个金额,给出货币张数最小的表示方案。问最小的询问次数,使得通过已知信息可以对应货币面值和颜色。分析最大的面值问一个\(\inf\)即可。这时只需要......
  • [ABC062C]/[ARC074A] Chocolate Bar 题解
    神秘分讨题(?总共\(4\)中情况。第一种:三个竖的并列:ans=min(ans,(h%3>0)*w);。第二种:三个横的并列:ans=min(ans,(w%3>0)*h);。第三种:一个横的矩形,然后是两个竖着的。For(i,1,h){ intfst=i*w; intscd=(w/2)*(h-i); intthd=(w%2>0)*(h-i)+(w/2)*(h-i); ans=min(ans......
  • 堆排序题解
    给定一个整数序列,请按非递减序输出采用堆排序的各趟排序后的结果。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。输入样例......
  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • CF1955G GCD on a grid 题解
    洛谷链接我们暴力枚举可能的答案\(k\),然后跑一边dp。设\(f_{i,j}\)表示在格子\((i,j)\)是否可以满足有一条路径可以到达该格子且该格子是否为\(k\)的倍数,递推式即为\(f_{i,j}=(k\mida_{i,j}\operatorname{and}(f_{i-1,j}\operatorname{or}f_{i,j-1}))\)最后的答......
  • ARC156C 题解
    blog。显然答案为\(0\)不行。打表发现最优答案总为\(1\)。考虑构造取到\(1\)的下界。观察到,\(\text{LCS}\le1\)等价于去掉两序列都不存在的数后,两序列完全相反。于是有:在\(\{x\},\{y\}\)后增加两序列都不存在的数,不影响LCS。进行\(\{x\}\to\{a,x,b\},\{y\}\to\{b,......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • [TJOI2019] 甲苯先生的字符串 题解
    T2[TJOI2019]甲苯先生的字符串矩阵乘法优化DP,所以一般来说这种DP都不怎么难。30pts的DP是裸的:设\(f_{i,j}\)为前\(i\)位、最后一位是\(j\)的方案数,则有转移方程:\[f_{i,j}=\sum_{k=0}^{25}f_{i-1,k}\landk\nej\]想要矩阵优化,我们想到构造答案矩阵:\[\mathit{an......
  • [PA2021] Od deski do deski 题解
    T1[PA2021]Oddeskidodeski发现合法的字符串一定是类似\(\texttt{aa...aabb...bbcc...cc}\)的形式,也就是若干个\(\texttta\)、若干个\(\textttb\) 和若干个\(\textttc\) 等组成的形式。如果当前选好的串\(S_1\)是合法的,且有另一个合法的串\(S_2\),那么显然\(S_1......