#include #include #include #include using namespace std; #define N (NLIMIT + 100) #define M (MLIMIT + 100) #define A (ALIMIT + 100) #define BLOCK 300 #define NLIMIT 100000 #define MLIMIT 500 #define ALIMIT 100000 #define MOD 1000000007 int a[N], b[M], ans[M*M], c[A], square[A]; vector primeFactors[A]; long long answer = 1; int expmod(int a, int b) { long long x = 1, y = a; while(b) { if(b&1) x = (x * y) % MOD; y = (y * y) % MOD; b >>= 1; } return (int) x; } void updatePrime(int prime, int v) { answer -= square[c[prime]]; c[prime] += v; answer += square[c[prime]]; } void add(int i) { int x = a[i]; for(int j=0; j 1) { primeFactors[i].push_back(x); } } int n, m; scanf("%d%d", &n, &m); assert(1 <= n && n <= NLIMIT); assert(1 <= m && m <= MLIMIT); for(int i=0; i q[tt].r) { swap(q[tt].l, q[tt].r); } q[tt].i = tt; } int pm = m; m *= m; sort(q, q+m, cmp); int curL = 0, curR = 0; answer = 0; for(int qq=0; qq l) { add(--curL); } while(curR <= r) { add(curR++); } while(curL < l) { remove(curL++); } while(curR > r+1) { remove(--curR); } answer %= MOD; if(answer < 0) { answer += MOD; } ans[q[qq].i] = (int)answer; } answer = 0; for(int i=0; i= MOD) { answer -= MOD; } } printf("%lld\n", answer); }