slon是乙個調皮的學生,為了讓他靜下心來,老師給他出了一道數學題:
給定表示式a,a中含有變數x和+,-,*,(,)這些符號,括號成對出現,乙個算術運算子均對應兩個運算元,不能出現(-5)或者(4+-5)等,乘號不能省略,並且表示式a中x只能是一階,即一階表示式:
合理表示式:a=5 + x∗(3 + 2) or x + 3∗x + 4∗(5 + 3∗(2 + x−2∗x)).
不合理表示式:a=5∗(3 + x∗(3 + x)) or x∗(x + x∗(1 + x)).
求a%m==p時,最小的x
輸入
第一行輸入乙個表示式a,(1 ≤|a|≤ 100000)。
第二行輸入兩個整數p (0 ≤ p ≤ m −1)和m (1 ≤ m ≤ 1000000)。
輸出
輸出最小的非負x (0 ≤ x ≤ 1000000)。
樣例輸入1
5+3+x
9 10
樣例輸出1
1樣例輸入2
20+3+x
0 5樣例輸出2
2樣例輸入3
3*(x+(x+4)*5)
1 7樣例輸出31
這道題本來是用字尾來做的,堅定操守的朋友請看老師的正解
我們先想:a是乙個一階表示式(一次函式)吧,
初中數學裡講了,乙個一次函式可以表達成 kx+b 的形式,比如樣例一可以表達成 x+8,樣例二可以表達成 x+23,樣例三可以表達成 18x+60 。
那麼只要求到了這個k和b,由於0 ≤ x ≤ 1000000,就能暴力列舉(也可以用擴歐,那樣快些)。
接下來就是本題的精髓:把賊複雜的表示式a縮成 kx+b 。
我們可以先用分塊的思想:因為加減法是最後計算的,所以把a分成若干部分相加的和,那麼是不是每乙個部分都能表示成 kx+b 的形式呢?(顯然)
用函式 ins() 來把乙個式子變為 kx+b,那麼由於把a分成多少份是不確定的,最好用乙個動態陣列vector儲存每個部分,當遇到乙個數或乙個x時,如果前面是「+」或「-」,就把它加進去(減法就加個負號);如果前面是「*」,就把陣列最後一位乘上它。
當遇到「(」時,就遞迴進去,把括號內的式子 ins() 成乙個 kx+b ,然後跟前面一樣的操作。
還有一點,因為題目沒說明a裡面的數有多大,所以可能爆longlong,要邊操作邊把數模m,不影響結果。
具體操作及細節請看下面的**
#include#include#include#include#include#include#define ll long long
using namespace std;
ll k,b,p,m;
int l;
string ss;
struct itnitn(ll k,ll b)
itn operator+(const itn&c)
itn operator*(const itn&c)
};char s;
itn ins()
} else if(s=='x')
if(l<=ss.length())s=ss[l++];
} else if(s=='+')
else if(s=='-')
else if(s=='*')
else if(s=='(')
if(l<=ss.length())s=ss[l++];
} }for(int i=0;i>ss;
scanf("%lld%lld",&p,&m);
s=ss[l++];
itn a=ins();
k=a.k,b=a.b;
//printf("a=%lldx+%lld\n",k,b);
for(ll x=0;x<=1000000;x++)
if(x*k+b>=0&&(x*k+b)%m==p)
puts("100000");
return 0;
}
數字營銷通常不同於傳統的營銷方式
隨著科技的日益發展,網際網路的發展和使用迫使企業要借助數字營銷。數字 是乙個富有成效的平台,可以讓企業自由地與觀眾建立聯絡,打造產品或服務的品牌,提高對產品的認知度,與觀眾建立有價值的關係,將您的企業定位為市場的領導者。magento開發 數字營銷被定義為通過各種形式的電子 廣告產品或服務。數字營銷...
DB2中不同於其它資料庫的操作
一 兩個字段聯接 select id,lastname firstname from t employee db2中用 來將兩個字段聯接起來 注意 不同於其它資料庫中用 來將兩個字段聯接起來 二 查出前幾條記錄 如sqlserver中的top select from t employee fetch...
深度學習中的優化不同於一般優化演算法
一 經驗風險最小化 1 機器學習中我們關注某些效能度量p,其定義在測試集上並且可能不可解。我們需要間接優化p。我們通過降低代價函式j j 來提高p。通常代價函式可寫為訓練集上的平均,如 j e x,y p data l f x y 1 j e x,y p d atal f x y 1 l是每個樣本的...