[HEOI2012]Akai的數學作業-題解
題目地址【IN】
- 題意簡述
給你一個多項式方程,形式如下,求其所有的有理數解。
- 暴力
我們發現輸出的是一個分子和分母互質的分數,所以我們列舉一下分子和分母,為了不超時,列舉大概不到,然後每次計算一下(用高精),大概能得到分。
- 優化
我們由於用高精,複雜度比較高,所以我們考慮取模意義下,當我們多取幾個模數,在這幾個模數的意義下,算出來都是,那麼也可以看作是答案,但是有一定錯的概率,當模數比較大且為質數時不容易錯,大概能拿分。
- 分析
我們可以將開始的式子轉換為分數形式,我們令
那麼原式就可以寫成:
接下來我們等式兩端同時乘以,那麼可以得到如下式子:
我們將式子兩端同時模,那麼可以得到:
我們可以得到肯定為的因子,即。
我們再將原式兩端同時模,那麼同樣可以得到:
我們同樣可以的到肯定為的因子,即
所以我們可得對於方程的解,我們就得知了且並且還要滿足(也就是題面要求的互質)。
- 正解
有了上面的分析,我們就可以先預處理對於和的因子,但是這裡有個問題就是如果或者,那麼我們對於就換成左邊第一個不為的係數,換成右邊第一個不為的因子(由於係數是,所以前面的都可以相當於沒有)。
然後我們可以列舉,由於的因子數最多為,所以我們可以直接列舉。
對於判斷一個解是否合法,我們可以取幾個模數,然後按照優化的暴力方式判斷一個解是否合法(其實有一個非常好的模數,只需這一個,就可以判斷了)。
然後對於每個列舉的,由於有負數的解,所以我們還要對每個列舉的去判斷。
然後我們用一個結構體寫一個分數類,將答案存入,並重載小於排序,輸出答案即可。
下面上程式碼:
#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+a1x+a2x2+⋯+anxn=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
)
luogu P3216 [HNOI2011]數學作業 矩陣快速冪
題意
把
1
−
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