1. 程式人生 > >[HEOI2012]Akai的數學作業-題解

[HEOI2012]Akai的數學作業-題解

題目地址【IN

  • 題意簡述

給你一個多項式方程,形式如下,求其所有的有理數解。

a0+a1x+a2x2++anxn=0a_0+a_1x+a_2x^2+\cdots+a_nx^n=0

  • 暴力

我們發現輸出的是一個分子和分母互質的分數,所以我們列舉一下分子和分母,為了不超時,列舉大概300300不到,然後每次計算一下(用高精),大概能得到3030分。

  • 優化

我們由於用高精,複雜度比較高,所以我們考慮取模意義下,當我們多取幾個模數,在這幾個模數的意義下,算出來都是00,那麼也可以看作是答案,但是有一定錯的概率,當模數比較大且為質數時不容易錯,大概能拿305030\sim 50

分。

  • 分析

我們可以將開始的式子轉換為分數形式,我們令x=pqx=\frac{p}{q}

那麼原式就可以寫成:

a0+a1(pq)+a2(pq)2++an(pq)n=0a_0+a_1\left(\frac{p}{q}\right)+a_2\left(\frac{p}{q}\right)^2+\cdots+a_n\left(\frac{p}{q}\right)^n = 0 a0+a1(pq)+a2(p2q2)++an(pnqn)=0a_0+a_1\left(\frac{p}{q}\right)+a_2\left(\frac{p^2}{q^2}\right)+\cdots+a_n\left(\frac{p^n}{q^n}\right) = 0

接下來我們等式兩端同時乘以qnq^n,那麼可以得到如下式子:

a0qn+a1pqn1+a2p2qn2++anpn=0a_0q^n+a_1pq^{n-1}+a_2p^2q^{n-2}+\cdots+a_np^n=0

我們將式子兩端同時模qq,那麼可以得到:

anpn0(modq)a_np^n\equiv0(\rm mod\ q)

我們可以得到qq肯定為ana_n的因子,即qanq|a_n

我們再將原式兩端同時模p

p,那麼同樣可以得到:

a0qn0(modp)a_0q^n\equiv0(\rm mod\ p)

我們同樣可以的到pp肯定為a0a_0的因子,即pa0p|a_0

所以我們可得對於方程的解x=pqx=\frac{p}{q},我們就得知了pa0p|a_0qanq|a_n並且還要滿足(p,q)=1(p,q)=1(也就是題面要求的p,qp,q互質)。

  • 正解

有了上面的分析,我們就可以先預處理對於a0a_0ana_n的因子,但是這裡有個問題就是如果a0=0a_0=0或者an=0a_n=0,那麼我們對於a0a_0就換成左邊第一個不為00的係數,a1a_1換成右邊第一個不為00的因子(由於係數是00,所以前面的都可以相當於沒有)。

然後我們可以列舉p,qp,q,由於2×1072\times 10^7的因子數最多為512512,所以我們可以直接5122512^2列舉。

對於判斷一個解pq\frac{p}{q}是否合法,我們可以取幾個模數,然後按照優化的暴力方式判斷一個解是否合法(其實有一個非常好的模數,只需這一個5003350033,就可以判斷了)。

然後對於每個列舉的pq\frac{p}{q},由於有負數的解,所以我們還要對每個列舉的pq\frac{p}{q}去判斷pq-\frac{p}{q}

然後我們用一個結構體寫一個分數類,將答案存入,並重載小於排序,輸出答案即可。

下面上程式碼:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int Mod=50033;
const int N=1010,M=110;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int fpow(int a,int b){int ans=1;for(;b;b>>=1,a=(1ll*a*a)%Mod)if(b&1)ans=(1ll*ans*a)%Mod;return ans;}
int in1[N],in2[N],c1,c2;
int A[M],n;
void init(){
	int a=0,b=0;
	for(int i=0;i<=n;i++)if(A[i]){a=A[i];break;}
	for(int i=n;i>=0;i--)if(A[i]){b=A[i];break;}
	if(a<0)a=-a;if(b<0)b=-b;
	int t1=sqrt(a),t2=sqrt(b);
	for(int i=1;i<=t1;i++){
		if(!(a%i)){
			in1[++c1]=i;
			if(a/i!=i)in1[++c1]=a/i;
		}
	}
	sort(in1+1,in1+c1+1);
	for(int i=1;i<=t2;i++){
		if(!(b%i)){
			in2[++c2]=i;
			if(b/i!=i)in2[++c2]=b/i;
		}
	}
	sort(in2+1,in2+c2+1);
}
struct node{
	int fz,fm;
	node(){}
	node(int a,int b):fz(a),fm(b){}
	bool operator <(const node &a)const{
		if((!fz||!fm)||(!a.fz||!a.fm)){
			if((!fz||!fm)&&(!a.fz||!a.fm)) return 1;
			if((!fz||!fm))return 0<a.fz;
			if((!a.fz||!a.fm))return fz<0;
		}
		ll t1=1ll*fz*a.fm,t2=1ll*a.fz*fm;
		return t1<t2
            
           

相關推薦

[HEOI2012]Akai數學作業-題解

題目地址【IN】 題意簡述 給你一個多項式方程,形式如下,求其所有的有理數解。 a0+a1x+a2x2+⋯+anxn=0a_0+a_1x+a_2x^2+\cdots+a_nx^n=0a0​+a1​x+a2​x2+⋯+an​xn=0 暴力 我們發現輸出的

[BZOJ2742][HEOI2012]Akai數學作業[推導]

題意 給定各項係數,求一元 \(n\) 次方程的有理數解。 \(n\leq 100\)。 分析 設答案為 \(\frac{p}{q}\) ,那麼多項式可以寫成 \(a_0\frac{p}{q}+a_1\frac{p^2}{q^2}+\cdots a_n\frac{p^n}{q^n}\) 的形式。

codevs 2314 數學作業

class 其中 block amp namespace memset int tmp oid 2314 數學作業 2011年省隊選拔賽湖南 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 大師

【bzoj 2326】【HNOI 2011】數學作業

alt cstring div ring ima void bzoj log 作業 題解:   矩陣裸體。    1 #include<cstdio> 2 #include<cstring> 3 #include<cma

bzoj 2326: [HNOI2011]數學作業

pac hid images ostream scanf stdin efi .com 數學 solution 矩陣: f: a: 10^k 0

[luogu P3216] [HNOI2011]數學作業

show lose src bit cnblogs mil log amp 我們 [luogu P3216] [HNOI2011]數學作業 題目描述 小 C 數學成績優異,於是老師給小 C 留了一道非常難的數學作業題: 給定正整數 N 和 M,要求計算 Concate

洛谷P3216 [HNOI2011]數學作業

nat sans ostream play 希望 span spa cat 思路 洛谷P3216 [HNOI2011]數學作業 題目描述 小 C 數學成績優異,於是老師給小 C 留了一道非常難的數學作業題: 給定正整數 N 和 M,要求計算 Concatenate (1 .

BZOJ2326: [HNOI2011]數學作業

long long 包含 參考 problem 得到 n) family esp gpo 【傳送門:BZOJ2326】 簡要題意:   給出n和m,要求計算Concatenate(1...n)%m的值,其中Concatenate(1...n)是將所有正整數1,2,&

【bzoj】2326 [HNOI2011]數學作業

gif 高位到低位 algo space n) n+1 const std class 【題意】給定n和m,求1~n從高位到低位連接%m的結果。n=11時,ans=1234567891011%m。n<=10^18,m<=10^9。 【算法】遞推+矩陣快速冪 【題

BZOJ5334:[TJOI2018]數學計算——題解

stream OS 輸出 訪問 logs uri getchar getchar() TP https://www.lydsy.com/JudgeOnline/problem.php?id=5334 小豆現在有一個數x,初始值為1. 小豆有Q次操作,操作有兩種類型:

BZOJ 2326 [HNOI2011]數學作業

KS sca hnoi tip sizeof 優化 ++ cout struct 這種題我都WA了一個小時我是不是沒救了 首先寫出遞推式$f[i]=f[i-1] \times 10^{len_{i}} + i $ 然後按照\(len_{i}\)分層用矩陣乘法優化即可 #in

P3216 [HNOI2011]數學作業 (矩陣快速冪)

接下來 hnoi2011 輸入 matrix spl play clu 快速冪 define P2774 方格取數問題 題目背景 none! 題目描述 在一個有 m*n 個方格的棋盤中,每個方格中有一個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取

小學生最喜歡的數學作業

需要 創建 是否 系統 作業 調試日誌 == 一個 ade ---恢復內容開始--- 今天又是充滿希望的一天嘛? 一、預估與實際 PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘) Plannin

只有計算機才能完成的小學數學作業

記得在上個月,微博上有一則熱議得新聞:小學數學老師佈置作業,要求“數一億粒米”。 網友大多數是以吐槽的態度去看待這件事,也有人指出能用估算的方法,這是一道考察發散思維的題目。 一開始我也覺得這個題目很荒唐,似乎是不可能完成的任務。但這個細細想來值得玩味,我在思考一個問題:如果從計算機的角

小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!

/* 思路1: 1)由於我們要找的是和為S的連續正數序列,因此這個序列是個公差為1的等差數列,而這個序列的中間值代表了平均值的大小。 假設序列長度為n,那麼這個序列的中間值可以通過(S / n)得到,知道序列的中間值和長度,也就不難求出這段序列了。 2)滿足條件的n分兩種情況: n為奇數時,

BZOJ 2326: [HNOI2011]數學作業(矩陣乘法)

can zoj define 遞推 \n problem main i++ std 傳送門 解題思路   NOIp前看到的一道題,當時想了很久沒想出來,NOIp後拿出來看竟然想出來了。註意到有遞推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1

洛谷3216 HNOI2011 數學作業(矩乘優化遞推)

題目連結 首先我們考慮,正常的 O ( n )

【[HNOI2011]數學作業

我又對著跑出正解的程式調了好久 怕不是眼瞎了 這就是個分段矩陣,我們很容易就得到了遞推式 $\(f[i]=f[i-1]*10^k+i\) 其中\(k=log_{10}i\) 於是就是分段矩陣 之後就是程式碼了,沒有加快速乘WA了好久 #include<iostream> #inc

[HNOI2011]數學作業 矩陣快速冪

題目描述 小 C 數學成績優異,於是老師給小 C 留了一道非常難的數學作業題: 給定正整數 NNN 和 MMM ,要求計算Concatenate(1..N) Concatenate (1 .. N) Concatenate(1..N) ModModMod MMM 的值,其中 Concatenat