日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 338 D. GCD Table

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 338 D. GCD Table 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://codeforces.com/problemset/problem/338/D

?

題意:

有一張n*m的表格,其中第i行第j列的數為gcd(i,j)

給出k個數

問在這張表格中是否 有某一行中連續的某一部分 就是 這k個數

?

題意轉化:

是否存在 一對i,j

滿足gcd(i,j)=a1,gcd(i,j+1)=a2,…… gcd(i,j+k-1)=ak

直觀上感覺:

i要滿足的必要條件是 i | ?lcm(a1,a2……ak)

j要滿足的必要條件是

j= a1*k1,j+1=a2*k2……,j+k-1=ak*k_k

相當于

j ≡ 0 mod a1

j ≡ -1 mod a2

……

j≡ -(k-1) mod ak

利用擴展中國剩余定理可以求出 滿足條件的最小的j

我們令i=lcm(a1,a2……ak)

去檢驗 是否滿足 gcd(i,j+m-1)= a_m ?m∈[1,k]

若滿足條件輸出YES,否則輸出NO

?

為什么用滿足必要條件的最小的i和j檢驗?

?

證明 i=?lcm(a1,a2……ak)是唯一滿足要求的i:

若還存在一個 i*x ?滿足條件,那么

將 i , i*x,j 質因數分解,存在一個 p^k 能整除i*x、j,不能整除i

∵ i=?lcm(a1,a2……ak)

∴i的質因數分解的任意一項 必須能整除 a中的某一個

而 p^k 不能整除a 中的任意一個,否則i的質因數分解包含 p^k

?

證明 滿足 j ≡ -(h-1) mod a[h] 的最小的j一定滿足要求

若存在一個j*x 滿足條件,而j不滿足條件

即 存在一個h,滿足 gcd(i,j+h-1)< a[h],gcd(i,j*x+h-1)= a[h]

將 j,j*x ,a[h]質因數分解,j*x 中?存在一個p^k2,滿足

j 中 為 p^k1,a[h] 中為 p^k2 , 且 k1<k2

∵??j ≡ -(h-1) mod a[h]?

即 j= a[h]*s - h+1

∴ j+h-1 = a[h]*s,所以k1>=k2

所以 最小的j一定滿足要求

?

#include<cstdio> #include<iostream>using namespace std;typedef long long LL;#define N 10001LL a[N];LL n1,a1;LL lcm;template<typename T> void read(T &x) {x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } }LL gcd(LL a,LL b) { return !b ? a : gcd(b,a%b); }bool judge_lcm(int k,LL n) {lcm=1;for(int i=1;i<=k;++i) {lcm=lcm/gcd(lcm,a[i])*a[i];if(lcm>n) return false;}return true; }void exgcd(LL a,LL b,LL &x,LL &y) {if(!b) { x=1; y=0; return;}exgcd(b,a%b,y,x); y-=a/b*x; }LL mul(LL a,LL b,LL mod) {LL res=0;while(b){if(b&1) { b--; res+=a; res%=mod; }a<<=1; a%=mod; b>>=1;}return res; } LL merge(LL n2,LL a2) {LL d=gcd(n1,n2),c=a2-a1;if(c%d) return -1;LL x,y;exgcd(n1/d,n2/d,x,y);LL mod=n2/d;x=(x%mod+mod)%mod;LL k=(mul(c/d,x,mod)%mod+mod)%mod;a1=(a1+n1*k%(mod*n1))%(mod*n1);n1*=mod;return a1; }int main() {LL n,m; int k;read(n); read(m); read(k);for(int i=1;i<=k;++i) read(a[i]);if(!judge_lcm(k,n)){puts("NO");return 0;}n1=a[1]; a1=0;LL j=a1;for(int i=2;i<=k;++i){j=merge(a[i],a[i]-(i-1));if(j==-1) { puts("NO"); return 0; }}if(!j) j=lcm;if(j+k-1>m) { puts("NO"); return 0;}for(int i=1;i<=k;++i) if(gcd(lcm,j+i-1)!=a[i]) { puts("NO"); return 0; }puts("YES"); }

?

轉載于:https://www.cnblogs.com/TheRoadToTheGold/p/8459432.html

總結

以上是生活随笔為你收集整理的Codeforces 338 D. GCD Table的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。